【问题标题】:Conflicting setter for property in jackson杰克逊财产的冲突二传手
【发布时间】:2015-04-19 10:09:06
【问题描述】:

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

java.lang.IllegalArgumentException:冲突的 setter 定义 属性“X”:ThirdPartyClass#setX(1 参数) vs ThirdPartyClass#setX(1 参数)

我听说你可以通过 MixIn 注释来解决它。

在我的控制器中,我给出了一个列表,我想知道是否有一种方法可以在某处自动定义 MixInAnnotation 的使用?

如果我必须返回一个字符串而不是对象,我会这样做:

ObjectMapper mapper = new ObjectMapper();
mapper.getSerializationConfig().addMixInAnnotations(xxx);
return mapper.writeValueAsString(myObject);

不过,我的控制器给了 List:

@RequestMapping(method = RequestMethod.GET)
public @ResponseBody List<MyObject> getMyObjects

在其他方法中多次返回 MyObject,所以我只想声明一次使用 MixInAnnotation 进行杰克逊序列化?

谢谢你, 杆

【问题讨论】:

    标签: json spring jackson


    【解决方案1】:

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

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

    定义Jackson2ObjectMapperBuilder 类型的@Bean 将允许您自定义默认ObjectMapperXmlMapper(分别用于MappingJackson2HttpMessageConverterMappingJackson2XmlHttpMessageConverter)。

    另一种自定义 Jackson 的方法是将 com.fasterxml.jackson.databind.Module 类型的 bean 添加到您的上下文中。它们将注册到每个 ObjectMapper 类型的 bean,当您向应用程序添加新功能时,为贡献自定义模块提供全局机制。

    基本上,这意味着如果您只是将Module 注册为具有提供的mixin 设置的bean,您应该已准备就绪,无需定义您自己的ObjectMapper 或更改HttpMessageConverters .

    【讨论】:

      【解决方案2】:

      因此,为了做到这一点,我在 Spring Web MVC 中自定义了 Jackson JSON 映射器。

      自定义映射器:

      @Component
      public class CustomObjectMapper extends ObjectMapper {
          public CustomObjectMapper() {
              this.addMixInAnnotations(Target.class, SourceMixIn.class);
          }
      }
      

      在 spring 上下文启动时注册新的映射器:

      @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 控制器。

      【讨论】:

        猜你喜欢
        • 2013-07-13
        • 1970-01-01
        • 2018-12-12
        • 2013-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多