WebMvcConfigurerAdapter

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<HttpMessageConverter<?>> converters) {
    converters.add(new MappingJackson2HttpMessageConverter());
}

// 其他配置...

}

通过使用 MappingJackson2HttpMessageConverter,Spring能够提供一种非常方便的方式来处理JSON数据,这在创建RESTful服务时尤其有用。

相关推荐
Mr_Air_Boy1 小时前
SpringBoot使用dynamic配置多数据源时使用@Transactional事务在非primary的数据源上遇到的问题
java·spring boot·后端
豆沙沙包?1 小时前
2025年- H77-Lc185--45.跳跃游戏II(贪心)--Java版
java·开发语言·游戏
年老体衰按不动键盘2 小时前
快速部署和启动Vue3项目
java·javascript·vue
咖啡啡不加糖2 小时前
Redis大key产生、排查与优化实践
java·数据库·redis·后端·缓存
liuyang-neu2 小时前
java内存模型JMM
java·开发语言
UFIT2 小时前
NoSQL之redis哨兵
java·前端·算法
刘 大 望2 小时前
数据库-联合查询(内连接外连接),子查询,合并查询
java·数据库·sql·mysql
怀旧,2 小时前
【数据结构】6. 时间与空间复杂度
java·数据结构·算法
大春儿的试验田3 小时前
Parameter ‘XXX‘ not found. Available parameters are [list, param1]
java
程序员JerrySUN4 小时前
[特殊字符] 深入理解 Linux 内核进程管理:架构、核心函数与调度机制
java·linux·架构