如何自定义 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.mzph.cn/news/906132.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何提升新加坡SAP实施成功率?解答中企出海的“税务合规密码” | 工博科技SAP金牌服务商

目录 中新双边经贸合作概况 ​编辑 新加坡数字化实施核心挑战 一、财税合规体系适配 税务申报差异 会计准则协同 二、人力资源合规管理 薪酬体系配置 数据安全规范 企业实施建议方案 一、系统建设策略 选择具备以下资质的实施服务商&#xff1a; 构建标准化功能模块…

人工智能视角下的安全:可视化如何塑造恶意软件检测

摘要 恶意软件是一种持续存在的网络安全威胁&#xff0c;它越来越多地通过复杂的攻击向量&#xff0c;瞄准互连的数字系统&#xff0c;如桌面、移动和物联网平台。通过利用这些漏洞&#xff0c;攻击者会损害现代数字生态系统的完整性和弹性。为了应对这一风险&#xff0c;安全…

游戏引擎学习第293天:移动Familiars

回顾并为今天的内容定下基调 我们正在做一款完整的游戏&#xff0c;今天的重点是“移动模式”的正式化处理。目前虽然移动机制大致能运作&#xff0c;但写法相对粗糙&#xff0c;不够严谨&#xff0c;我们希望将其清理得更规范&#xff0c;更可靠一点。 目前脑逻辑&#xff0…

golang -- 如何让main goroutine等一等

目录 引言一、sync.WaitGroup二、channel创建channle操作缓冲多返回值模式单向通道 引言 在不做修饰的程序中&#xff0c;代码是串行执行的 串行、并发与并行串行&#xff1a;事物按照一定的发展顺序并发&#xff1a;同一时间段执行多个任务&#xff08;一边吃饭一边看电视&am…

第31讲 循环缓冲区与命令解析

串口在持续接收数据时容易发生数据黏包&#xff08;先接收的数据尚未被处理&#xff0c;后面的数据已经将内存覆盖&#xff09;的情况&#xff0c;循环缓冲区的本质就是将串口接受到的数据马上拷贝到另外一块内存之中。为了避免新来的数据覆盖掉尚未处理的数据&#xff0c;一方…

UE 材质基础 第一天

课程&#xff1a;虚幻引擎【UE5】材质宝典【初学者材质基础入门系列】-北冥没有鱼啊_-稍后再看-哔哩哔哩视频 随便记录一些 黑色是0到负无穷&#xff0c;白色是1到无穷 各向异性 有点类似于高光&#xff0c;可以配合切线来使用&#xff0c;R G B 相当于 X Y Z轴&#xff0c;切…

编译原理--期末复习

本文是我学习以下博主视频所作的笔记&#xff0c;写的不够清晰&#xff0c;建议大家直接去看这些博主的视频&#xff0c;他/她们讲得非常好&#xff1a; 基础知识概念&#xff1a; 1.【【编译原理】期末复习 零基础自学】&#xff0c;资料 2.【编译原理—混子速成期末保过】&…

【DeepSeek论文精读】11. 洞察 DeepSeek-V3:扩展挑战和对 AI 架构硬件的思考

欢迎关注[【AIGC论文精读】](https://blog.csdn.net/youcans/category_12321605.html&#xff09;原创作品 【DeepSeek论文精读】1. 从 DeepSeek LLM 到 DeepSeek R1 【DeepSeek论文精读】7. DeepSeek 的发展历程与关键技术 【DeepSeek论文精读】11. 洞察 DeepSeek-V3&#xff…

宝塔面板部署前后端项目SpringBoot+Vue2

这篇博客主要用来记录宝塔部署前端后端项目的过程。因为宝塔部署有点麻烦&#xff0c;至少在我看来挺麻烦的。我还是喜欢原始的ssh连接服务器进行操作。但是公司有项目用到了宝塔&#xff0c;没办法啊&#xff0c;只能摸索记录一下。 我们需要提前准备好后端项目的jar包和前端项…

电机试验平台:创新科技推动电动机研究发展

电机试验平台是电机制造和研发过程中不可或缺的重要设备&#xff0c;其功能涵盖了电机性能测试、电机寿命测试、电机质量评估等多个方面。随着科技的不断发展和电机应用领域的日益扩大&#xff0c;对电机试验平台的要求也越来越高。本文将从现代化电机试验平台的设计与应用两个…

LangGraph 7 - Platform - Agentic RAG、监督、SQL代理、追踪、私密对话、认证、RemoteGraph、LangSmith

文章目录 代理式检索增强生成&#xff08;Agentic RAG&#xff09;安装 1、预处理文档2、创建检索器工具3、生成查询4、文档分级5、问题重写6、生成答案7、构建流程图8、运行智能RAG代理 多智能体监督系统安装配置1、创建工作代理研究代理数学代理工具 2、使用 langgraph-super…

生命之树--树形dp

1.树形dp--在dfs遍历树的同时dp&#xff0c;从上到下递归&#xff0c;到叶子是边界条件 https://www.luogu.com.cn/problem/P8625 #include<bits/stdc.h> using namespace std; #define N 100011 typedef long long ll; typedef pair<ll,int> pii; int n,c; ll …

10.8 LangChain三大模块深度实战:从模型交互到企业级Agent工具链全解析

LangChain Community 项目:Model I/O, Retrieval, Agent Tooling 关键词:LangChain Model I/O, 检索增强生成, Agent 工具链, 多路召回策略, 工具调用协议 1. Model I/O 模块:大模型交互标准化接口 Model I/O 是 LangChain 生态中连接大模型的核心模块,定义了统一的输入输…

鸿蒙OSUniApp 实现图片上传与压缩功能#三方框架 #Uniapp

UniApp 实现图片上传与压缩功能 前言 在移动应用开发中&#xff0c;图片上传是一个非常常见的需求。无论是用户头像、朋友圈图片还是商品图片&#xff0c;都需要上传到服务器。但移动设备拍摄的图片往往尺寸较大&#xff0c;直接上传会导致流量消耗过大、上传时间过长&#x…

已经装了pygame但pycharm显示没有该模块/软件包无法加载出来下载pygame

首先&#xff0c;如果你已经通过pip install pygame或者其他什么命令下载好了pygame &#xff08;可以通过pip list查看&#xff0c;有pygame说明pygame已经成功安装在当前python环境中&#xff09;。然而&#xff0c;如果你在 PyCharm 中仍然看不到 pygame&#xff0c;可能是因…

第6章 实战案例:基于 STEVAL-IDB011V1 板级 CI/CD 全流程

在前五章中,我们完成了嵌入式 CI/CD 从环境搭建、编译自动化、测试自动化、发布分发到监控回归的全技术链条。本章将以 STEVAL-IDB011V1(搭载 BlueNRG-355)评估板为实战载体,手把手演示如何在 GitLab CI(或 Jenkins)上,构建一条从 Git Push → 编译 → 测试 → 刷写 → …

系统架构设计(十四):解释器风格

概念 解释器风格是一种将程序的每个语句逐条读取并解释执行的体系结构风格。程序在运行时不会先被编译为机器码&#xff0c;而是动态地由解释器分析并执行其语义。 典型应用&#xff1a;Python 解释器、JavaScript 引擎、Bash Shell、SQL 引擎。 组成结构 解释器风格系统的…

1-机器学习的基本概念

文章目录 一、机器学习的步骤Step1 - Function with unknownStep2 - Define Loss from Training DataStep3 - Optimization 二、机器学习的改进Q1 - 线性模型有一些缺点Q2 - 重新诠释机器学习的三步Q3 - 机器学习的扩展Q4 - 过拟合问题&#xff08;Overfitting&#xff09; 一、…

SQL里where条件的顺序影响索引使用吗?

大家好&#xff0c;我是锋哥。今天分享关于【SQL里where条件的顺序影响索引使用吗&#xff1f;】面试题。希望对大家有帮助&#xff1b; SQL里where条件的顺序影响索引使用吗&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 SQL 查询中&#xff0c;W…

计算机科技笔记: 容错计算机设计05 n模冗余系统 TMR 三模冗余系统

NMR&#xff08;N-Modular Redundancy&#xff0c;N 模冗余&#xff09;是一种通用的容错设计架构&#xff0c;通过引入 N 个冗余模块&#xff08;N ≥ 3 且为奇数&#xff09;&#xff0c;并采用多数投票机制&#xff0c;来提升系统的容错能力与可靠性。单个模块如果可靠性小于…