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服务时尤其有用。

相关推荐
葡萄_成熟时_3 分钟前
JavaWeb后端基础(4)
java·开发语言·数据库·maven·web
Lojarro23 分钟前
JavaEE基础之-session&cookie
java·java-ee
A boy CDEF girl26 分钟前
【JavaEE】线程安全
java·安全·java-ee
何政@30 分钟前
Mysql面试篇笔记:
java·数据库·spring boot·笔记·mysql·面试
工一木子40 分钟前
【Java基础】Java中new一个对象时,JVM到底做了什么?
java
馨谙1 小时前
Exception in thread “main“ java.lang.ExceptionInInitializerError
java·开发语言
caihuayuan41 小时前
Golang的数据库分库分表
java·大数据·sql·spring·课程设计
柃歌1 小时前
【UCB CS 61B SP24】Lecture 19 & 20: Hashing & Hashing II 学习笔记
java·数据结构·笔记·学习·算法
试着奔跑的菜鸟1 小时前
经验分享:用一张表解决并发冲突!数据库事务锁的核心实现逻辑
java·经验分享·高并发·分布式锁
云卷️1 小时前
微服务面试题及原理
java·后端·微服务·云原生·架构