WebMvcConfigurerAdapter 是Spring 3.1到Spring 5.0版本中用于自定义Spring MVC配置的一个便捷适配器类。在Spring 5.0及之后的版本中,WebMvcConfigurerAdapter 已经被标记为过时(deprecated),并且官方推荐直接实现 WebMvcConfigurer 接口。不过,对于老版本的Spring来说,WebMvcConfigurerAdapter 提供了一个简单的方法来扩展Spring MVC的默认配置而不用实现所有的方法。
通过扩展 WebMvcConfigurerAdapter 并重写其中的方法,开发者可以添加或自定义Spring MVC配置,例如:
注册自定义的视图控制器(View Controllers)
添加静态资源处理器(Static Resources Handlers)
配置默认的Servlet处理
添加拦截器(Interceptors)
添加格式化器和转换器(Formatters and Converters)
添加验证器(Validators)
配置消息转换器(Message Converters)
配置视图解析器(View Resolvers)
配置跨域请求处理(CORS)
例子
在Spring 5.0之前,你可以通过扩展 WebMvcConfigurerAdapter 来自定义Spring MVC配置:
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
public class MyWebConfig extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyCustomInterceptor());
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
}
// 其他覆盖方法...
}
在Spring 5.0及之后的版本
从Spring 5.0开始,应该使用 WebMvcConfigurer 接口。你可以直接实现这个接口,并重写你需要自定义的方法。Java 8的接口默认方法使得这个过程变得更加简单,因为你不需要实现所有的方法,只需要重写你感兴趣的那些。下面是一个使用 WebMvcConfigurer 接口的例子:
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class MyWebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyCustomInterceptor());
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
}
// 其他自定义方法...
}
在新的Spring版本中使用 WebMvcConfigurer 而不是 WebMvcConfigurerAdapter 是一个更好的实践,因为这避免了依赖过时的类,并且更加符合Spring框架的未来方向。
MappingJackson2HttpMessageConverter 是Spring框架中用于处理HTTP请求和响应中JSON数据的一个类。它是 HttpMessageConverter 接口的具体实现,使用Jackson 2.x库将Java对象序列化为JSON格式以及将JSON格式的数据反序列化为Java对象。
在Spring MVC和Spring Boot中,MappingJackson2HttpMessageConverter 主要负责以下任务:
请求体读取:当客户端发送一个请求,且Content-Type为application/json时,MappingJackson2HttpMessageConverter 会将JSON格式的请求体数据转换成相应的Java对象,以便控制器方法可以处理这些数据。
响应体写入:当控制器方法处理完请求并返回一个Java对象时,如果这个控制器方法使用了 @ResponseBody 注解标注,或者在Spring Boot中,由于默认已配置了 @RestController,MappingJackson2HttpMessageConverter 会自动将Java对象序列化为JSON格式的字符串,并将其写入HTTP响应体中。
内容协商:在Spring MVC中,基于请求的Accept头部或Content-Type头部,MappingJackson2HttpMessageConverter 与其他消息转换器一起参与内容协商,从而根据客户端期望的内容类型提供适当的响应。
工作原理
在Spring的web应用程序中,DispatcherServlet 处理传入的HTTP请求,并协调其他组件来生成响应。在这个处理过程中,HandlerAdapter 调用控制器方法,并且在这之后,它会检查该方法是否有 @ResponseBody 注解或者响应类型是否为 ResponseEntity。如果是这样,DispatcherServlet 会使用可用的 HttpMessageConverter 实例来写入响应。
MappingJackson2HttpMessageConverter 就是这些 HttpMessageConverter 实现之一。Spring会根据请求或响应的MIME类型自动选择合适的转换器。
例如,当控制器方法返回一个对象,并且客户端请求的Accept头部为 application/json 或未指定时,MappingJackson2HttpMessageConverter 会接管并将对象转换为JSON。
配置和定制
在Spring Boot应用程序中,MappingJackson2HttpMessageConverter 通常是自动配置的,你无需手动添加。不过,你可以通过定制 ObjectMapper 来改变JSON的序列化和反序列化行为。下面是一个如何定制 ObjectMapper 的例子:
@Bean
public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {
return builder -> {
builder.simpleDateFormat(“yyyy-MM-dd”);
builder.serializers(new CustomSerializer());
// 更多定制…
};
}
在不使用Spring Boot的Spring MVC应用程序中,你可能需要自己配置 MappingJackson2HttpMessageConverter。这通常涉及到将其声明为一个Bean并将其注册到 WebMvcConfigurer 接口实现中:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List> converters) {
converters.add(new MappingJackson2HttpMessageConverter());
}
// 其他配置...
}
通过使用 MappingJackson2HttpMessageConverter,Spring能够提供一种非常方便的方式来处理JSON数据,这在创建RESTful服务时尤其有用。