WebMvcConfigurer对于springMvc的定制化

一、WebMvcConfigurer的接口注释。

定义回调方法以自定义通过@EnableWebMvc启用的 Spring MVC 的基于 Java 的配置。
@EnableWebMvc -annotated 配置类可以实现这个接口以被回调并有机会自定义默认配置。

二、依次来说明方法

2.1 addArgumentResolvers 添加参数解析器

​ HandlerMethodArgumentResolver: 从NativeWebRequest读取到HanlerMethod需要的参数的方法。

  @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(argumentResolver());
    }

2.2 addCorsMappings 处理跨域问题

https://www.cnblogs.com/yuansc/p/9076604.html

@Override
public void addCorsMappings(CorsRegistry registry) {
      registry.addMapping("/**")
        .allowedOrigins("*")
        .allowedHeaders("*")//可以让用户拿到的请求头
        .allowCredentials(true) //用户是否允许发送cookie
        .allowedMethods("*")
        .maxAge(3600);
}

2.3 addFormatters 扩展添加Converter或Formatter

https://www.jianshu.com/p/e2505bc1a73d

Converter除了springMVC会用,其他场合也会用。

Formatter是线程安全的PropertyEditor。

@Override
public void addFormatters(FormatterRegistry registry) {
		registry.addFormatter(new BookFormatter(bookRepository));
}
public class BookFormatter implements Formatter<Book>{
   private BookRepository repository;

   public BookFormatter(BookRepository repository){
     this.repository = repository;
   }

   @Override

   public Book parse(String bookIdentifier, Locale locale)throws ParseException{
     Book book = repository.findBookByIsbn(bookIdentifier);
     return book ;
   }

   @Override
   public String print(Book book, Locale locale){
     return book.getIsbn();
   } 
}

2.4 addInterceptors 添加拦截器

  @Override
  public void addInterceptors(InterceptorRegistry registry) {
        InterceptorRegistration registration = registry.addInterceptor(new SuperAdminInterceptor());
        /*指定拦截器 要拦截的请求(支持*通配符)*/
        registration.addPathPatterns("/super_admin/**");
        //指定拦截器 不拦截的请求(支持*通配符)
        registration.excludePathPatterns("/super/toLogin");
  }

2.5 addResourceHandlers 处理静态资源文件映射

@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
    String os = System.getProperty("os.name");
    //如果是Windows系统
    if (os.toLowerCase().startsWith("win")) {
        registry.addResourceHandler("/app_file/**")
                // /app_file/**表示在磁盘filePathWindow目录下的所有资源会被解析为以下的路径
                .addResourceLocations("file:" + filePathWindow);
    } else {  //linux 和mac
        registry.addResourceHandler("/app_file/**")
                .addResourceLocations("file:" + filePathLinux) ;
    }
    super.addResourceHandlers(registry);
}

2.6addReturnValueHandlers 添加返回值处理器

@Override
public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers) {
    returnValueHandlers.add(new MyHandlerMethodReturnValueHandler());
}

public class MyHandlerMethodReturnValueHandler implements HandlerMethodReturnValueHandler {
    @Override
    public boolean supportsReturnType(MethodParameter methodParameter) {
        return methodParameter.hasMethodAnnotation(ResponseBody.class);
    }

    @Override
    public void handleReturnValue(Object o, MethodParameter methodParameter, ModelAndViewContainer 															modelAndViewContainer,NativeWebRequest nativeWebRequest) throws Exception {
        modelAndViewContainer.setRequestHandled(true);//不需要设置view处理
        nativeWebRequest.getNativeResponse(HttpServletResponse.class)
            .getWriter()
            .write(JSONUtils.toJSONString(o));
    }
}

2.7addViewControllers 地址资源文件映射

@Override
public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/test").setViewName("/test");
}
posted @ 2021-07-04 23:56  Matteo-Carati  阅读(163)  评论(0)    收藏  举报