一、简介
WebMvcConfigurer是Spring MVC提供的一个接口,在使用Spring Boot构建应用程序时常用到。它提供一种扩展Spring MVC配置的方式,覆盖默认的Spring MVC自动配置,从而实现更加自定义化的功能。官方文档中对WebMvcConfigurer的描述如下:
public interface WebMvcConfigurer { default void configureViewResolvers(ViewResolverRegistry registry) { } default void addResourceHandlers(ResourceHandlerRegistry registry) { } default void configureMessageConverters(List>converters) { } default void extendMessageConverters(List >converters) { } default Validator getValidator() { return null; } default MessageCodesResolver getMessageCodesResolver() { return null; } default void configureContentNegotiation(ContentNegotiationConfigurer configurer) { } default void configureAsyncSupport(AsyncSupportConfigurer configurer) { } default void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { } default void addFormatters(FormatterRegistry registry) { } default void addInterceptors(InterceptorRegistry registry) { } default void addCorsMappings(CorsRegistry registry) { } default void configurePathMatch(PathMatchConfigurer configurer) { } default void configureViewHandling(ViewResolverRegistry registry) { } default void configureRedirectHandling(RedirectViewControllerRegistry registry) { } default void configureHandlerExceptionResolvers(List resolvers) { } default void extendHandlerExceptionResolvers(List resolvers) { } default void addArgumentResolvers(List resolvers) { } default void addReturnValueHandlers(List handlers) { } default void configureMessageConverters(List > converters) { } default void configureContentNegotiation(ContentNegotiationConfigurer configurer) { } }
如上所示,接口提供了多个方法,可以实现对Spring MVC的自定义配置,这使得开发者能够灵活地扩展和改变Spring Boot应用程序的行为。
二、实战演示
接下来将通过代码演示,对WebMvcConfigurer的常见用法进行讲解。
1. 修改默认的ViewResolver
在Spring Boot中,默认配置的ViewResolver是InternalResourceViewResolver,它的作用是将JSP文件名字映射为物理视图文件的路径。
通过实现WebMvcConfigurer接口,可以轻松更改该默认配置:
@Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void configureViewResolvers(ViewResolverRegistry registry) { registry.jsp("/WEB-INF/views/", ".jsp"); } }
举例的Spring Boot配置文件如下:
spring: mvc: view: prefix: /WEB-INF/views/ suffix: .jsp
以上两种方法都是实现Spring Boot默认的配置实现技术灵活修改的一种方式。对于修改默认的ViewResolver,可以从上面这两种方法任选其一。
2. 添加静态资源目录
Spring Boot默认读取静态文件的目录是src/main/resources/static,这个可以在application.properties文件中配置,如下:
spring.resources.static-locations=classpath:/static/
但是,如果我们把静态文档放在了WEB-INF目录下的static目录中,此时使用上述配置时是不能读取到相关的资源,那么修改WebMvcConfigurer就是一个核心的实现:
@Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**").addResourceLocations("/WEB-INF/static/"); } }
以上是在配置类中添加方法addResourceHandlers,配置静态资源目录所需的做法。
3. 添加拦截器
当我们需要统计请求数、执行时间等方面的监控指标时,就可以使用Spring Boot提供的拦截器来实现。在WebMvcConfigurer中添加拦截器有两种方式,一种是创建一个对象,将其加入到Spring容器中,然后将其注入到InterceptorRegistry中;另一种是直接把拦截器加入到InterceptorRegistry中,这里讲解第一种方式:
@Configuration public class WebMvcConfig implements WebMvcConfigurer { @Bean public MyInterceptor myInterceptor() { return new MyInterceptor(); } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(myInterceptor()).addPathPatterns("/**"); } }
其中,MyInterceptor是一个实现了HandlerInterceptor接口的拦截器类。
4. 配置Content-Type
在RESTful API中,客户端需要访问不同的接口返回各种不同的数据格式。 Spring Boot提供了通过Content-Type来处理各种数据格式的方法。如下所示的配置,可以将返回JSON格式的数据:
@Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List> converters) { MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); List mediaTypes = new ArrayList<>(); mediaTypes.add(MediaType.APPLICATION_JSON_UTF8); converter.setSupportedMediaTypes(mediaTypes); converters.add(converter); } }
通过上述配置,可以将返回的数据格式设置成JSON形式。
5. 高级类型验证
在Spring Boot应用程序中,要验证请求中的参数和对象的正确性,可以使用Spring Boot提供的注解或JSR-303 (@NotBlank、@NotNull等)。还可以扩展高级验证,例如自定义验证规则,可以按如下所示进行配置:
@Configuration public class WebMvcConfig implements WebMvcConfigurer { @Autowired private MyValidator myValidator; @Override public Validator getValidator() { return myValidator; } }
这里的MyValidator类实现了Spring提供的Validator接口。通过实现自定义的验证规则,可以在应用程序中拦截并报告错误。
三、总结
通过WebMvcConfigurer,开发者可以很方便地进行Spring MVC的自定义配置,覆盖默认配置。这使得实现更加自定义化的功能变得便捷,同时也提高了应用程序的扩展性和灵活性。本文从多个方面对WebMvcConfigurer进行了详细的解释,希望对读者有所帮助。