在杰克逊的财产冲突的设定者

时间:2015-02-18 11:57:05

标签: json spring jackson

由于杰克逊对第三方对象的序列化,我的网络服务控制器出了问题。

  

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序列化?

谢谢你, 杆

2 个答案:

答案 0 :(得分:1)

我建议您按照Spring Docs中提供的步骤使用“Spring Way”。

  

如果您想完全替换默认ObjectMapper,请定义该类型的@Bean并将其标记为@Primary

     

定义@Bean类型Jackson2ObjectMapperBuilder,您可以自定义默认ObjectMapperXmlMapper(分别用于MappingJackson2HttpMessageConverterMappingJackson2XmlHttpMessageConverter )。

     

自定义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。