Я все еще немного не знаком со Spring, но столкнулся с проблемой , которая заставляет реализовать мой собственный десериализатор для Jackson. Процедура описана в небольшом учебном пособии , однако я застрял в Spring. Я не понимаю, где
ObjectMapper mapper = new ObjectMapper();
в Spring MVC выполняется, когда json десериализуется методом класса контроллера. Поэтому я не знаю, что делать, чтобы заменить десериализатор по умолчанию на собственный десериализатор.
Любые предложения приветствуются.
Вы не говорите, как вы используете Jackson в Spring, поэтому я предполагаю, что вы используете его через
и аннотации @RequestBody
и/или @ResponseBody
.
Одна из вещей, которую делает
, заключается в регистрации bean-компонента AnnotationMethodHandlerAdapter
, который поставляется с рядом предварительно настроенных HttpMessageConverter
. ] bean-компоненты, в том числе MappingJacksonHttpMessageConverter
, который обрабатывает маршалинг между классами модели, аннотированными Джексоном, и обратно.
Теперь MappingJacksonHttpMessageConverter
имеет метод setObjectMapper()
, который позволяет переопределить метод ObjectMapper
по умолчанию. Но поскольку MappingJacksonHttpMessageConverter
создается за кулисами с помощью
, вы не можете добраться до него.
Однако
— это просто удобный короткий путь. Точно так же допустимо объявить свой собственный bean-компонент AnnotationMethodHandlerAdapter
, внедрить в него свой собственный bean-компонент MappingJacksonHttpMessageConverter
(через свойство messageConverters
) и внедрить свой собственный настроенный ObjectMapper
.
Тогда у вас возникает проблема, как создать собственный ObjectMapper
, так как это не очень удобный для Spring класс. Я предлагаю написать собственную простую реализацию FactoryBean
.
В итоге вы получите что-то вроде этого:
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="objectMapper">
<bean class="com.x.MyObjectMapperFactoryBean"/>
</property>
</bean>
</property>
</bean>
Хотел бы я лучше знать Spring MVC, но с реализациями Jax-RS, такими как Jersey и RESTeasy, нужно регистрировать провайдеров. Может быть, Spring делает что-то подобное?