由于杰克逊对第三方对象的序列化,我的网络服务控制器出了问题。
java.lang.IllegalArgumentException:冲突的setter定义 property" X":ThirdPartyClass #setX(1 params)vs ThirdPartyClass #setXX(1 PARAMS)
我已经读过你可以通过MixIn注释来解决它。
在我的控制器中我给出了一个列表,我想知道是否有办法自动定义某个地方使用MixInAnnotation?
如果我不得不返回String而不是对象,我会这样做:
ObjectMapper mapper = new ObjectMapper();
mapper.getSerializationConfig().addMixInAnnotations(xxx);
return mapper.writeValueAsString(myObject);
尽管如此,我的控制器正在给出List:
@RequestMapping(method = RequestMethod.GET)
public @ResponseBody List<MyObject> getMyObjects
并且在其他方法中多次返回MyObject,所以我只想声明一次使用MixInAnnotation进行jackson序列化?
谢谢你, 杆
答案 0 :(得分:1)
我建议您按照Spring Docs中提供的步骤使用“Spring Way”。
如果您想完全替换默认
ObjectMapper
,请定义该类型的@Bean
并将其标记为@Primary
。定义
@Bean
类型Jackson2ObjectMapperBuilder
,您可以自定义默认ObjectMapper
和XmlMapper
(分别用于MappingJackson2HttpMessageConverter
和MappingJackson2XmlHttpMessageConverter
)。自定义Jackson的另一种方法是将类型为
com.fasterxml.jackson.databind.Module
的bean添加到您的上下文中。它们将在ObjectMapper
类型的每个bean中注册,在您向应用程序添加新功能时提供全局机制来提供自定义模块。
基本上这意味着如果您只是使用提供的mixin-settings将Module
注册为bean,则应该全部设置,并且不需要定义自己的ObjectMapper
或更改HttpMessageConverter
秒。
答案 1 :(得分:0)
因此,为了做到这一点,我在Spring Web MVC中定制了Jackson JSON映射器。
自定义映射器:
@Component
public class CustomObjectMapper extends ObjectMapper {
public CustomObjectMapper() {
this.addMixInAnnotations(Target.class, SourceMixIn.class);
}
}
在弹簧上下文的启动时注册新的映射器:
@Component
public class JacksonInit {
@Autowired
private RequestMappingHandlerAdapter requestMappingHandlerAdapter;
@Autowired
private CustomObjectMapper objectMapper;
@PostConstruct
public void init() {
List<HttpMessageConverter<?>> messageConverters = requestMappingHandlerAdapter.getMessageConverters();
for (HttpMessageConverter<?> messageConverter : messageConverters) {
if (messageConverter instanceof MappingJackson2HttpMessageConverter) {
MappingJackson2HttpMessageConverter m = (MappingJackson2HttpMessageConverter) messageConverter;
m.setObjectMapper(objectMapper);
}
}
}
}
多亏了这一点,我没有修改我的WebService Controller。