您好我在以下情况中遇到问题:
我使用Spring 4.xx和Jackson 2.xx并且我正在使用RESTful Web应用程序。我现在面临的问题是我需要为我的一个模型进行一些自定义序列化,所以我使用了自定义的serilaizer,但我还需要在序列化时从数据库中获取一些数据。所以我试着将我的Serivce注入Serializer但它总是保持为空。
据我所知,如果你直接设置你的对象会发生这种情况,我想这就是杰克逊所做的事情。但是还有什么方法可以继续使用依赖注入吗?
此外,如果我让类实现ApplicationContextAware接口并调用ApplicationContext#getBean(),它将永远挂起。
以下是一些代码来说明我的问题
Serialzer.java
public class TheSerializer extends JsonSerializer<MyObject>
implements ApplicationContextAware {
@Autowired
ITheService theService;
ApplicationContext ctx;
public vodi serialize(MyObject o, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
if(theService == null) {
theService = ctx.getBean(ITheService.class); //This is where it hangs
//If I don't do this I get a NPE if I try to use theSerivice
}
}
}
我的配置主要是基于注释的,只有数据库内容是在xml中完成的。
提前谢谢你,
wastl
答案 0 :(得分:1)
您可以使用@Configurable spring注释将spring bean注入非spring bean。
如何解释:http://www.kubrynski.com/2013/09/injecting-spring-dependencies-into-non.html
答案 1 :(得分:1)
Jackson ObjectMapper
允许您注入HandlerInstantiator
,它将用于创建JsonSerializer
和JsonDeserializer
(以及其他)。
在v4.1.3中,Spring引入了SpringHandlerInstantiator
,它实现了此接口,并为您完成所有自动装配。
因此,您所需要做的就是配置ObjectMapper
:
@Bean
public SpringHandlerInstantiator handlerInstantiator(AutowireCapableBeanFactory beanFactory)
{
return new SpringHandlerInstantiator(beanFactory);
}
@Bean
public ObjectMapper objectMapper(SpringHandlerInstantiator handlerInstantiator)
{
ObjectMapper mapper = new ObjectMapper();
mapper.setHandlerInstantiator(handlerInstantiator);
return mapper;
}
如果您以这种方式创建Jackson2ObjectMapperBuilder
,也可以在ObjectMapper
上设置此属性。