Как @autowire некоторые bean в JsonSerializer?

Я использую ленивую загрузку спящего режима в своем веб-приложении.

Я хотел бы загрузить некоторые объекты из базы данных на этапе синтаксического анализа ответа сервера

@Component
public class DesignSerializer extends JsonSerializer<Design> {
@Autowired
IDesignService designService; <-- is null

}

Это совершенно понятно, потому что DesignSerializer создается с помощью "нового" оператора для каждого объекта.

Я уверен, что есть способ вставить мой bean в этот сериализатор, когда он будет создан, я просто не знаю, как это сделать.

Можете ли вы, ребята, помочь мне или указать мне в правильном направлении.

Ответы

Ответ 1

Решение SpringBeanAutowiringSupport, если вы используете Spring Framework 2.5 +.

public class DesignSerializer extends JsonSerializer<Design> {

    @Autowired
        IDesignService designService;
    }

    public DesignSerializer(){
        SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);    
    }

...

}

Надеюсь, что вам поможет

Ответ 2

У нас была та же проблема с автосозданием JsonSerializer и Spring. Решение, которое сработало для нас, состояло в том, чтобы создать два конструктора. Один для Spring, который устанавливает зависимость как статическое поле, а другой - для инициализации Джексона.

Это работает, потому что инъекция зависимостей Spring (autowiring) происходит до того, как Джексон инициализирует сериализатор.

@Component
public class MyCustomSerializer extends JsonSerializer<String> {

    private static IDesignService designService;

    // Required by Jackson annotation to instantiate the serializer
    public MyCustomSerializer() { }

    @Autowired
    public MyCustomSerializer(IDesignService designService) {
        this.designService = designService;
    }

    @Override
    public void serialize(String m, JsonGenerator gen, SerializerProvider s) {
        gen.writeObject(MyCustomSerializer.designService.method(..));
    }
}

Ответ 3

Я решил проблему, создав статическое поле в другом bean, а затем @Autowire его метод setter.

@Service("ToolBox")
@Transactional
public class ToolBox 
{
static Logger logger = Logger.getLogger(ToolBox.class);


private static IService service;


@Autowired
public void setService(IService service)
{
    ToolBox.service = service;
}

public static IService getService()
{
    return ToolBox.service;
}}

как показано в этой теме: Можете ли вы использовать @Autowired со статическими полями?