Как @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 со статическими полями?