当前位置: 首页 > backend >正文

如何自定义 Spring MVC 的配置?

我们可以通过实现 WebMvcConfigurer 接口来自定义 Spring MVC (尤其是在 Spring Boot 环境中) 的配置。

以下是通过实现 WebMvcConfigurer 接口的配置方法:

核心:创建一个 @Configuration 类并实现 WebMvcConfigurer

import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.validation.MessageCodesResolver;
import org.springframework.validation.Validator;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.config.annotation.*; // 关键导入import java.util.List;@Configuration
// 在Spring Boot中不需要 @EnableWebMvc,除非你想完全禁用Spring Boot的MVC自动配置
public class MyCustomWebMvcConfigurer implements WebMvcConfigurer {// 具体配置方法如下:
}

可以定制的方面:

  1. 拦截器 (Interceptors):

    • 方法: addInterceptors(InterceptorRegistry registry)
    • 用途: 添加自定义拦截器,用于在请求处理之前、之后或完成时执行通用逻辑,如日志记录、权限校验、事务管理等。
    • 示例:
      @Override
      public void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyAuthInterceptor()).addPathPatterns("/secure/**") // 拦截以 /secure/ 开头的路径.excludePathPatterns("/secure/login", "/secure/public/**"); // 排除某些路径
      }
      
  2. 格式化器和转换器 (Formatters and Converters):

    • 方法: addFormatters(FormatterRegistry registry)
    • 用途: 注册自定义的 Formatter (用于特定类型的格式化,如日期) 和 Converter (用于类型之间的转换),这些在数据绑定时非常有用。
    • 示例:
      @Override
      public void addFormatters(FormatterRegistry registry) {registry.addConverter(new StringToMyCustomObjectConverter());registry.addFormatter(new MyCustomDateFormatter());
      }
      
  3. HTTP 消息转换器 (HttpMessageConverters):

    • 方法:
      • configureMessageConverters(List<HttpMessageConverter<?>> converters): 完全替换默认的转换器列表。
      • extendMessageConverters(List<HttpMessageConverter<?>> converters): 在默认转换器列表的基础上添加或修改。推荐使用这个,因为它保留了Spring Boot的自动配置转换器。
    • 用途: 配置 Spring MVC 如何将请求体转换为Java对象,以及如何将Java对象转换为响应体 (例如,处理JSON、XML、Protobuf等)。
    • 示例 (使用 extendMessageConverters):
      @Override
      public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {// 添加一个自定义的 Protobuf 消息转换器// converters.add(0, new ProtobufHttpMessageConverter()); // 添加到列表开头// 或者移除/修改已有的转换器,例如配置Jackson// for (HttpMessageConverter<?> converter : converters) {//     if (converter instanceof MappingJackson2HttpMessageConverter) {//         ObjectMapper objectMapper = ((MappingJackson2HttpMessageConverter) converter).getObjectMapper();//         // 自定义 Jackson ObjectMapper 的配置//         objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);//     }// }
      }
      
  4. 静态资源处理 (Static Resource Handling):

    • 方法: addResourceHandlers(ResourceHandlerRegistry registry)
    • 用途: 配置静态资源(如CSS, JavaScript, 图片)的URL映射和物理位置。Spring Boot 自动配置了一些默认位置,但可以通过此方法添加更多或覆盖。
    • 示例:
      @Override
      public void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/my-assets/**") // 对外暴露的URL模式.addResourceLocations("classpath:/custom-static/", "file:/var/www/my-app-assets/") // 实际资源位置.setCachePeriod(3600 * 24); // 缓存周期 (秒)
      }
      
  5. 跨域资源共享 (CORS) 配置:

    • 方法: addCorsMappings(CorsRegistry registry)
    • 用途: 全局配置CORS,允许或限制来自不同源的跨域请求。
    • 示例:
      @Override
      public void addCorsMappings(CorsRegistry registry) {registry.addMapping("/api/**") // 对 /api/ 下的所有路径生效.allowedOrigins("http://example.com", "https://trusted.client.com") // 允许的源.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") // 允许的方法.allowedHeaders("*") // 允许所有请求头.allowCredentials(true) // 是否允许发送Cookie.maxAge(3600); // 预检请求的缓存时间 (秒)
      }
      
  6. 视图控制器 (View Controllers):

    • 方法: addViewControllers(ViewControllerRegistry registry)
    • 用途: 为那些不需要任何业务逻辑、仅将URL路径直接映射到视图名称的简单情况提供快捷配置。
    • 示例:
      @Override
      public void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/").setViewName("home"); // 访问根路径时显示 home 视图registry.addViewController("/about").setViewName("aboutPage");registry.addRedirectViewController("/old-path", "/new-path"); // 重定向
      }
      
  7. 内容协商 (Content Negotiation) 策略:

    • 方法: configureContentNegotiation(ContentNegotiationConfigurer configurer)
    • 用途: 配置 Spring MVC 如何根据客户端请求(如 Accept 头、URL参数、路径扩展名)来决定响应的内容类型(如JSON, XML)。
    • 示例:
      @Override
      public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {configurer.favorParameter(true) // 启用基于URL参数的协商 (如 ?format=json).parameterName("mediaType") // 自定义参数名,默认为 "format".ignoreAcceptHeader(false) // 是否忽略 Accept 请求头 (默认为 false).defaultContentType(MediaType.APPLICATION_JSON) // 默认返回JSON.mediaType("xml", MediaType.APPLICATION_XML) // 将 "xml" 映射到 application/xml.mediaType("json", MediaType.APPLICATION_JSON); // 将 "json" 映射到 application/json
      }
      
  8. 自定义参数解析器 (Argument Resolvers):

    • 方法: addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers)
    • 用途: 注册自定义的参数解析器,用于将请求中的特定信息解析并注入到Controller方法的参数中。
    • 示例:
      // @Override
      // public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
      //     resolvers.add(new CurrentUserArgumentResolver()); // 假设有一个解析当前用户的解析器
      // }
      
  9. 自定义返回值处理器 (Return Value Handlers):

    • 方法: addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers)
    • 用途: 注册自定义的返回值处理器,用于处理Controller方法返回的特定类型的值。
    • 示例:
      // @Override
      // public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) {
      //     handlers.add(new MyCustomReturnValueHandler());
      // }
      
  10. 路径匹配配置 (Path Matching):

    • 方法: configurePathMatch(PathMatchConfigurer configurer)
    • 用途: 配置URL路径匹配的细节,例如是否使用后缀模式匹配 (.json, .xml),是否匹配URL末尾的斜杠。
    • 示例:
      @Override
      public void configurePathMatch(PathMatchConfigurer configurer) {configurer.setUseSuffixPatternMatch(false); // 推荐禁用后缀匹配configurer.setUseTrailingSlashMatch(true); // 路径末尾的 / 是否视为与没有 / 相同
      }
      
  11. 异步请求处理配置 (Async Support):

    • 方法: configureAsyncSupport(AsyncSupportConfigurer configurer)
    • 用途: 配置异步请求处理的相关参数,如默认超时时间、任务执行器等。
    • 示例:
      @Override
      public void configureAsyncSupport(AsyncSupportConfigurer configurer) {configurer.setDefaultTimeout(60 * 1000L); // 设置默认超时时间为60秒// configurer.setTaskExecutor(myAsyncTaskExecutor()); // 配置自定义的异步任务执行器
      }
      
  12. 视图解析器 (View Resolvers):

    • 方法: configureViewResolvers(ViewResolverRegistry registry)
    • 用途: 配置视图解析器。在Spring Boot中,常见的模板引擎(如Thymeleaf, FreeMarker)通常会自动配置其视图解析器。如果你需要自定义或添加额外的视图解析器(如JSP),可以在这里进行。
    • 示例 (配置JSP视图解析器):
      // @Override
      // public void configureViewResolvers(ViewResolverRegistry registry) {
      //     InternalResourceViewResolver resolver = new InternalResourceViewResolver();
      //     resolver.setPrefix("/WEB-INF/jsp/");
      //     resolver.setSuffix(".jsp");
      //     registry.viewResolver(resolver);
      // }
      
  13. 异常处理器 (Exception Resolvers):

    • 方法: configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers)extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers)
    • 用途: 配置如何处理在请求处理过程中发生的异常。Spring Boot提供了默认的错误处理机制,但你可以通过此方法添加自定义的 HandlerExceptionResolver
    • 示例 (使用 extendHandlerExceptionResolvers):
      // @Override
      // public void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
      //     resolvers.add(0, new MyCustomGlobalExceptionResolver());
      // }
      
  14. 获取Validator实例 (Validator):

    • 方法: getValidator()
    • 用途: 返回一个用于数据绑定的全局 Validator 实例。你可以覆盖此方法以提供自定义的 Validator
    • 示例:
      // @Override
      // public Validator getValidator() {
      //     // return new MyCustomValidator(); // 返回你自定义的Validator
      //     return WebMvcConfigurer.super.getValidator(); // 或调用父类方法获取默认
      // }
      
  15. 获取消息代码解析器 (MessageCodesResolver):

    • 方法: getMessageCodesResolver()
    • 用途: 返回一个用于从数据绑定错误中生成错误消息代码的 MessageCodesResolver
    • 示例:
      // @Override
      // public MessageCodesResolver getMessageCodesResolver() {
      //     // return new MyCustomMessageCodesResolver();
      //     return WebMvcConfigurer.super.getMessageCodesResolver();
      // }
      

通过实现 WebMvcConfigurer 并覆盖这些方法,可以灵活的定制Spring MVC的行为,同时还能充分利用Spring Boot的自动配置带来的便利。

http://www.xdnf.cn/news/6071.html

相关文章:

  • 【unity游戏开发——编辑器扩展】使用EditorGUI的EditorGUILayout绘制工具类在自定义编辑器窗口绘制各种UI控件
  • 高速数字测试利器,新款是德科技UXR0504B示波器
  • RPA vs. 传统浏览器自动化:效率与灵活性的终极较量
  • STM32 片上资源之串口
  • 《实现模式》以Golang视角解读 价值观和原则 day 1
  • 快速定位到源码位置的插件 - vite/webpack
  • 【Python】普通方法、类方法和静态方法的区分
  • hbase shell的常用命令
  • 双目云台摄像机:双摄安防功能全方位
  • Java运行原理分析
  • LeetCode 热题 100 114. 二叉树展开为链表
  • Spring的bean的生命周期?
  • 【机器学习】支持向量回归(SVR)从入门到实战:原理、实现与优化指南
  • 各大编程语言基本语法区别
  • 游戏引擎学习第279天:将实体存储移入世界区块
  • 为什么 Linux 上默认没有 host.docker.internal
  • 【内网渗透】——NTML以及Hash Relay
  • MySQL Explain 中 Type 与 Extra 字段详解
  • MySQL 服务器配置和管理(上)
  • 监听用户切换浏览器标签页,切换回页面刷新页面
  • 代码随想录算法训练营第60期第三十五天打卡
  • 嵌入式自学第二十天(5.13)
  • AIStarter新功能上线:模型管理与创作者收益系统全面升级,助力AI开发效率提升
  • 函数定义、 异常处理、 迭代器协议、内置函数、返回值
  • WiFi密码查看器打开软件自动获取数据
  • 通用Agent如何评估效果:智能体评测方案AgentCLUE-General(Manus暂时领先)
  • 人形机器人的 9 个分岔口
  • 图灵爬虫练习平台 第十四题 逆向
  • 一款倒计时结束强制关闭浏览器的插件
  • 可视化图解算法38:重建二叉树