详解WebMvcConfigurer用法
目录
二、配置内容协商?configureContentNegotiation
三、配置异步请求的支持configureAsyncSupport ?
五、注册简单的视图控制器addViewControllers
六、注册自定义的参数解析器addArgumentResolvers
七、注册自定义的返回值处理器addReturnValueHandlers ?
八、配置消息转换器configureMessageConverters ?
WebMvcConfigurer
是 Spring Framework 中的一个接口,它提供了一种扩展 Spring MVC 配置的方式。通过实现 WebMvcConfigurer
接口,你可以定制化 Spring MVC 的配置,例如添加拦截器、资源处理、视图解析器等。
一、路径匹配规则configurePathMatch
configurePathMatch
是 WebMvcConfigurer
接口中的一个方法,它用于配置 Spring MVC 中的路径匹配规则。主要用于配置路径匹配的选项,例如设置路径是否区分大小写、路径后缀是否匹配等。
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
// 设置路径是否区分大小写,默认为 true
configurer.setUseCaseSensitiveMatch(false);
// 设置是否在路径匹配时忽略路径后缀,默认为 true
configurer.setUseTrailingSlashMatch(true);
}
}
在上述示例中,通过 configurePathMatch
方法设置了两个路径匹配的选项:
-
setUseCaseSensitiveMatch(false)
:设置路径是否区分大小写。默认情况下,路径匹配是区分大小写的。如果设置为false
,则表示路径不区分大小写。 -
setUseTrailingSlashMatch(true)
:设置是否在路径匹配时忽略路径后缀。默认情况下,路径匹配时会忽略路径后缀。如果设置为true
,则表示路径匹配时考虑路径后缀。
二、配置内容协商?configureContentNegotiation
configureContentNegotiation
是 WebMvcConfigurer
接口中的一个方法,它用于配置内容协商(Content Negotiation)的选项。内容协商是指客户端和服务器之间协商最适合的响应格式的过程。在 Spring MVC 中,可以通过 configureContentNegotiation
方法配置内容协商的相关选项。
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
// 设置默认的内容类型
configurer.defaultContentType(MediaType.APPLICATION_JSON);
// 启用路径扩展(例如:/data.json)
configurer.favorPathExtension(true);
// 启用参数扩展(例如:/data?format=json)
configurer.favorParameter(true);
// 设置参数名称,默认是 "format"
configurer.parameterName("mediaType");
// 设置支持的媒体类型
configurer.mediaType("json", MediaType.APPLICATION_JSON);
configurer.mediaType("xml", MediaType.APPLICATION_XML);
}
}
在上述示例中,通过 configureContentNegotiation
方法设置了以下内容协商的选项:
-
defaultContentType(MediaType.APPLICATION_JSON)
:设置默认的内容类型为 JSON。 -
favorPathExtension(true)
:启用路径扩展,例如允许/data.json
或/data.xml
。 -
favorParameter(true)
:启用参数扩展,例如允许/data?format=json
或/data?format=xml
。 -
parameterName("mediaType")
:设置参数名称,默认是 "format"。 -
mediaType("json", MediaType.APPLICATION_JSON)
和mediaType("xml", MediaType.APPLICATION_XML)
:设置支持的媒体类型。
三、配置异步请求的支持configureAsyncSupport
?
configureAsyncSupport
是 WebMvcConfigurer
接口中的一个方法,它用于配置异步请求的支持。异步请求指的是客户端发起的请求,服务器在处理请求的过程中可以释放对连接的占用,而不必等待请求处理完成。这使得服务器能够更有效地处理大量的并发请求。
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.AsyncSupportConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.config.annotation.AsyncSupportConfigurer.DefaultTimeoutConfigurer;
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
@Override
public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
// 设置异步请求超时时间(毫秒)
configurer.setDefaultTimeout(30000);
// 设置异步请求线程池
configurer.setTaskExecutor(myAsyncTaskExecutor());
// 配置异步请求拦截器
configurer.registerCallableInterceptors(myAsyncCallableInterceptor());
configurer.registerDeferredResultInterceptors(myAsyncDeferredResultInterceptor());
}
// 自定义异步请求线程池
@Bean
public AsyncTaskExecutor myAsyncTaskExecutor() {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(5);
taskExecutor.setMaxPoolSize(10);
taskExecutor.setQueueCapacity(25);
taskExecutor.initialize();
return taskExecutor;
}
// 自定义异步请求拦截器
@Bean
public CallableProcessingInterceptor myAsyncCallableInterceptor() {
return new MyAsyncCallableInterceptor();
}
// 自定义DeferredResult拦截器
@Bean
public DeferredResultProcessingInterceptor myAsyncDeferredResultInterceptor() {
return new MyAsyncDeferredResultInterceptor();
}
// 示例的自定义CallableProcessingInterceptor实现
private static class MyAsyncCallableInterceptor implements CallableProcessingInterceptor {
// 实现自定义逻辑
}
// 示例的自定义DeferredResultProcessingInterceptor实现
private static class MyAsyncDeferredResultInterceptor implements DeferredResultProcessingInterceptor {
// 实现自定义逻辑
}
}
上述代码中,通过 configureAsyncSupport
方法配置了异步请求的一些选项:
-
setDefaultTimeout(30000)
:设置异步请求的默认超时时间为 30 秒。 -
setTaskExecutor(myAsyncTaskExecutor())
:配置自定义的异步请求线程池。 -
registerCallableInterceptors(myAsyncCallableInterceptor())
:注册自定义的Callable
请求拦截器。 -
registerDeferredResultInterceptors(myAsyncDeferredResultInterceptor())
:注册自定义的DeferredResult
请求拦截器。
四、配置格式化器addFormatters?
addFormatters
是 WebMvcConfigurer
接口中的一个方法,用于配置格式化器(Formatter)。格式化器在 Spring MVC 中用于将字符串表示的数据转换成实际的 Java 对象,或者反过来将 Java 对象转换成字符串。
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
@EnableWebMvc
public class MyWebMvcConfigurer implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
// 添加自定义的日期格式化器
registry.addFormatter(new MyDateFormatter());
// 添加自定义的金额格式化器
registry.addFormatter(new MyCurrencyFormatter());
}
// 示例的自定义日期格式化器
private static class MyDateFormatter implements Formatter<Date> {
// 实现日期格式化逻辑
}
// 示例的自定义金额格式化器
private static class MyCurrencyFormatter implements Formatter<BigDecimal> {
// 实现金额格式化逻辑
}
}
上述代码中,通过 addFormatters
方法配置了两个自定义的格式化器:
-
MyDateFormatter
:自定义的日期格式化器,实现了Formatter<Date>
接口。 -
MyCurrencyFormatter
:自定义的金额格式化器,实现了Formatter<BigDecimal>
接口。
五、配置拦截器addInterceptors?
addInterceptors
是 WebMvcConfigurer
接口中的一个方法,它用于配置拦截器(Interceptor)。拦截器可以用于在请求进入处理器(controller)之前或之后执行一些逻辑,例如日志记录、权限验证等。?
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
@EnableWebMvc
public class MyWebMvcConfigurer implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 添加自定义的拦截器
registry.addInterceptor(new MyInterceptor())
.addPathPatterns("/api/**")
.excludePathPatterns("/public/**");
}
// 示例的自定义拦截器
private static class MyInterceptor implements HandlerInterceptor {
// 在请求处理之前调用
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 实现拦截器的逻辑
return true; // 继续执行后续的拦截器或处理器
}
// 在请求处理之后调用
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 实现拦截器的逻辑
}
// 在整个请求完成之后调用
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 实现拦截器的逻辑
}
}
}
上述代码中,通过 addInterceptors
方法配置了一个自定义的拦截器 MyInterceptor
:
-
addPathPatterns("/api/**")
:指定拦截的路径。 -
excludePathPatterns("/public/**")
:指定不拦截的路径。
MyInterceptor
类实现了 HandlerInterceptor
接口,其中的三个方法分别在请求处理之前、之后以及整个请求完成之后被调用。你可以在这些方法中实现自定义的拦截逻辑,例如权限验证、日志记录等。
五、注册简单的视图控制器addViewControllers
addViewControllers
是 WebMvcConfigurer
接口中的一个方法,用于注册简单的视图控制器,从而无需编写控制器方法即可实现 URL 到视图的映射。
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
@Configuration
@EnableWebMvc
public class MyWebMvcConfigurer implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
// 注册简单的视图控制器
registry.addViewController("/home").setViewName("home");
registry.addViewController("/login").setViewName("login");
registry.addViewController("/dashboard").setViewName("dashboard");
}
}
上述代码中,通过 addViewControllers
方法注册了三个简单的视图控制器:
/home
映射到名为 "home" 的视图。/login
映射到名为 "login" 的视图。/dashboard
映射到名为 "dashboard" 的视图。
六、注册自定义的参数解析器addArgumentResolvers
addArgumentResolvers
是 WebMvcConfigurer
接口中的一个方法,用于注册自定义的参数解析器(Argument Resolvers)。参数解析器在 Spring MVC 中用于将请求中的参数映射到控制器方法的参数上,或者在处理器方法执行前进行一些额外的参数解析逻辑。?
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;
@Configuration
@EnableWebMvc
public class MyWebMvcConfigurer implements WebMvcConfigurer {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
// 注册自定义的参数解析器
argumentResolvers.add(new MyCustomArgumentResolver());
}
// 示例的自定义参数解析器
private static class MyCustomArgumentResolver implements HandlerMethodArgumentResolver {
// 实现参数解析逻辑
}
}
上述代码中,通过 addArgumentResolvers
方法注册了一个自定义的参数解析器 MyCustomArgumentResolver
。这个自定义的解析器需要实现 HandlerMethodArgumentResolver
接口,然后在接口方法中实现参数的解析逻辑。
自定义参数解析器可以用于解析控制器方法的参数,将请求中的数据转换为控制器方法所需的参数类型。这样的定制可以用于处理一些特殊的场景,例如将请求中的 JSON 数据转换为对象等。
七、注册自定义的返回值处理器addReturnValueHandlers
?
addReturnValueHandlers
是 WebMvcConfigurer
接口中的一个方法,用于注册自定义的返回值处理器(Return Value Handlers)。返回值处理器在 Spring MVC 中用于将控制器方法的返回值转换为响应体的内容。?
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;
@Configuration
@EnableWebMvc
public class MyWebMvcConfigurer implements WebMvcConfigurer {
@Override
public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers) {
// 注册自定义的返回值处理器
returnValueHandlers.add(new MyCustomReturnValueHandler());
}
// 示例的自定义返回值处理器
private static class MyCustomReturnValueHandler implements HandlerMethodReturnValueHandler {
// 实现返回值处理逻辑
}
}
上述代码中,通过 addReturnValueHandlers
方法注册了一个自定义的返回值处理器 MyCustomReturnValueHandler
。这个自定义的处理器需要实现 HandlerMethodReturnValueHandler
接口,然后在接口方法中实现返回值的处理逻辑。
自定义返回值处理器可以用于处理控制器方法的返回值,将其转换为适当的响应格式。这样的定制可以用于处理一些特殊的场景,例如将对象转换为 JSON 数据等。
八、配置消息转换器configureMessageConverters
?
configureMessageConverters
是 WebMvcConfigurer
接口中的一个方法,用于配置消息转换器(Message Converters)。消息转换器在 Spring MVC 中负责将 HTTP 请求的数据转换为 Java 对象,以及将 Java 对象转换为 HTTP 响应的数据。
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;
@Configuration
@EnableWebMvc
public class MyWebMvcConfigurer implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
// 注册自定义的消息转换器
converters.add(new MyCustomMessageConverter());
// 注册Jackson的JSON消息转换器
converters.add(new MappingJackson2HttpMessageConverter());
}
// 示例的自定义消息转换器
private static class MyCustomMessageConverter extends AbstractHttpMessageConverter<Object> {
// 实现消息转换逻辑
}
}
上述代码中,通过 configureMessageConverters
方法注册了两个消息转换器:
-
MyCustomMessageConverter
:自定义的消息转换器,需要继承AbstractHttpMessageConverter
并实现相应的转换逻辑。 -
MappingJackson2HttpMessageConverter
:Jackson 框架提供的 JSON 消息转换器,用于将 JSON 数据转换为对象,以及将对象转换为 JSON 数据。
自定义消息转换器可以用于处理特殊的数据格式,例如 XML、Protocol Buffers 等。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!