Статьи

Настройка HttpMessageConverters с помощью Spring Boot и Spring MVC

Предоставление конечной точки на основе REST для приложения Spring Boot или в этом отношении простое приложение Spring MVC является простым, ниже приведен контроллер, предоставляющий конечную точку для создания объекта на основе содержимого, переданного ей в POST:

1
2
3
4
5
6
7
8
9
@RestController
@RequestMapping("/rest/hotels")
public class RestHotelController {
        ....
 @RequestMapping(method=RequestMethod.POST)
 public Hotel create(@RequestBody @Valid Hotel hotel) {
  return this.hotelRepository.save(hotel);
 }
}

Внутренне Spring MVC использует компонент, называемый HttpMessageConverter, для преобразования запроса Http в представление объекта и обратно.

Набор конвертеров по умолчанию регистрируется автоматически, что поддерживает целый ряд различных форматов представления ресурсов — например, json, xml.

Теперь, если есть необходимость каким-либо образом настроить конвертеры сообщений, Spring Boot делает это просто. В качестве примера рассмотрим, должен ли метод POST в приведенном выше примере быть немного более гибким и должен игнорировать свойства, которых нет в сущности Hotel — как правило, это можно сделать путем настройки Jackson ObjectMapper , все, что нужно сделать с помощью Spring Загрузка заключается в создании нового bean-компонента HttpMessageConverter, который в конечном итоге переопределяет все конвертеры сообщений по умолчанию следующим образом:

1
2
3
4
5
6
7
8
@Bean
 public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
  MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
  ObjectMapper objectMapper = new ObjectMapper();
  objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
  jsonConverter.setObjectMapper(objectMapper);
  return jsonConverter;
 }

Это хорошо работает для приложения Spring-Boot, однако для простых приложений Spring MVC, которые не используют Spring-Boot, настройка пользовательского конвертера немного сложнее — конвертеры по умолчанию не зарегистрированы по умолчанию, и конечный пользователь должен четко указать регистрацию значений по умолчанию — ниже приведен соответствующий код для приложений на основе Spring 4:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
@Configuration
public class WebConfig extends WebMvcConfigurationSupport {
 
 @Bean
 public MappingJackson2HttpMessageConverter customJackson2HttpMessageConverter() {
  MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
  ObjectMapper objectMapper = new ObjectMapper();
  objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
  jsonConverter.setObjectMapper(objectMapper);
  return jsonConverter;
 }
  
 @Override
 public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
  converters.add(customJackson2HttpMessageConverter());
  super.addDefaultHttpMessageConverters();
 }
}

Здесь WebMvcConfigurationSupport предоставляет способ более тонкой настройки конфигурации уровня MVC приложения на основе Spring. В методе configureMessageConverters пользовательский преобразователь регистрируется, а затем выполняется явный вызов, чтобы убедиться, что значения по умолчанию также зарегистрированы. Немного больше работы, чем для приложения на основе Spring-Boot.

Ссылка: Настройка HttpMessageConverters с Spring Boot и Spring MVC от нашего партнера JCG Биджу Кунджуммена в блоге all and sundry.