为Spring Boot应用程序或直接的Spring MVC应用程序公开基于REST的终结点很简单,以下是一个控制器,该终结点公开了一个终结点,用于基于其发布的内容创建实体:
@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来完成。引导是创建一个新的HttpMessageConverter bean,最终将覆盖所有默认消息转换器,这种方式是:
@Beanpublic 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-Boot的直接Spring MVC应用程序,配置自定义转换器要稍微复杂一些-默认转换器未默认注册,最终用户必须明确说明如何注册默认值-以下是基于Spring 4的应用程序的相关代码:
@Configuration
public class WebConfig extends WebMvcConfigurationSupport {@Beanpublic MappingJackson2HttpMessageConverter customJackson2HttpMessageConverter() {MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();ObjectMapper objectMapper = new ObjectMapper();objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);jsonConverter.setObjectMapper(objectMapper);return jsonConverter;}@Overridepublic void configureMessageConverters(List<HttpMessageConverter<?>> converters) {converters.add(customJackson2HttpMessageConverter());super.addDefaultHttpMessageConverters();}
}
在这里, WebMvcConfigurationSupport提供了一种更好地调整基于Spring的应用程序的MVC层配置的方法。 在configureMessageConverters方法中,正在注册自定义转换器,然后进行显式调用以确保还注册了默认值。 比基于Spring-Boot的应用程序需要更多的工作。
翻译自: https://www.javacodegeeks.com/2014/09/customizing-httpmessageconverters-with-spring-boot-and-spring-mvc.html