在SpringMVC或者SpringBoot的使用时,定义接口往往会用到RequestParam和RequestBody及ResponseBody这三个注解,RequestParam明确地告诉controller,这参数是从请求参数中获取。尤其POST请求要使用后两个的注解,对应着Controller方法的参数解析和返回值处理。在这里先不说RequestParam,因为对RequestParam的处理可以通过继承HttpServletRequestWrapper去做全局处理。
SpringMVC处理请求和响应时,支持多种类型的请求参数和返回类型,而此种功能的实现就需要对HTTP消息体和参数及返回值进行转换,为此SpringMVC提供了大量的转换类,所有转换类都实现了HttpMessageConverter接口。
参数解析器和返回值处理器在底层处理时,都是通过HttpMessageConverter进行转换。流程如下:
HttpMessageConverter我们常用的一般是Json和Xml,但是ProtoBuf变的越来越流行起来。Xml面向过去,Json面向现在,ProtoBuf面向未来。至于每个Converter是干嘛的这里就不解释了。
HttpMessageConverter只处理POST过来的RequestBody对象,比如List<T>,T等。我们一般会在序列化和反序列化的时候统一去处理对象中的Key的类型转换及value的处理。
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer();//序列化
simpleModule.addDeserializer();//反序列化
objectMapper.registerModule(simpleModule);
jackson2HttpMessageConverter.setObjectMapper(objectMapper);
converters.add(jackson2HttpMessageConverter);
}
SpringMVC 默认的解析工具Jackson。SpringBoot默认自带是jackson,网上有很多json转换速率的比对,但是Jackson已经够用了。