2015-02-18 3 views
0

У меня проблема в моем контроллере webservice из-за сериализации джексона стороннего объекта.Конфликтующий сеттер для свойства в jackson

java.lang.IllegalArgumentException: Противоречивые определения Присваиватель собственности "X": ThirdPartyClass # Setx (1 PARAMS) против ThirdPartyClass # Setx (1 PARAMS)

Я читал, что вы может решить его благодаря аннотации MixIn.

В моем контроллере я предоставляю список, я хотел бы знать, есть ли способ автоматически определить где-то использование MixInAnnotation?

Если я должен был сделать возвращать строку вместо объектов, я хотел бы сделать что-то вроде этого:

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

Тем не менее, мой контроллер дает список:

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

и несколько раз возвращался MyObject в других методах, и поэтому я хотел бы объявить только один раз использование MixInAnnotation для сериализации jackson?

Спасибо, RoD

ответ

1

Я предлагаю вам использовать «Весенний путь» для этого, выполнив шаги, указанные в разделе Spring Docs.

Если вы хотите полностью заменить по умолчанию ObjectMapper, определить @Bean этого типа и пометить его как @Primary.

Определение @Bean типа Jackson2ObjectMapperBuilder позволит вам настроить как по умолчанию ObjectMapper и XmlMapper (используется в MappingJackson2HttpMessageConverter и MappingJackson2XmlHttpMessageConverter соответственно).

Другой способ настройки Jackson заключается в добавлении бобов типа com.fasterxml.jackson.databind.Module в ваш контекст. Они будут зарегистрированы с каждым компонентом типа ObjectMapper, обеспечивая глобальный механизм внесения пользовательских модулей при добавлении новых функций в ваше приложение.

В основном это означает, что если вы просто зарегистрировать Module как боб с предусмотренными подмешать-настройками, вы должны быть все готово и не будет никакой необходимости определить свой собственный ObjectMapper или изменить HttpMessageConverter с.

0

Итак, для того, чтобы сделать это, я настроил картографа Джексон JSON в Spring Web MVC.

Пользовательские картографа:

@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 контроллера.