您的位置:

深入浅出webmvcconfigurer

一、简介

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进行了详细的解释,希望对读者有所帮助。