Spring, Jackson и настройка (например, CustomDeserializer)

Я все еще немного не знаком со Spring, но столкнулся с проблемой , которая заставляет реализовать мой собственный десериализатор для Jackson. Процедура описана в небольшом учебном пособии , однако я застрял в Spring. Я не понимаю, где

 ObjectMapper mapper = new ObjectMapper();

в Spring MVC выполняется, когда json десериализуется методом класса контроллера. Поэтому я не знаю, что делать, чтобы заменить десериализатор по умолчанию на собственный десериализатор.

Любые предложения приветствуются.

21
задан Community 23 May 2017 в 12:18
поделиться

2 ответа

Вы не говорите, как вы используете 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>
19
ответ дан 29 November 2019 в 21:12
поделиться

Хотел бы я лучше знать Spring MVC, но с реализациями Jax-RS, такими как Jersey и RESTeasy, нужно регистрировать провайдеров. Может быть, Spring делает что-то подобное?

0
ответ дан 29 November 2019 в 21:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: