如何自定義 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.pswp.cn/news/906132.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/906132.shtml
英文地址,請注明出處:http://en.pswp.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;來提升系統的容錯能力與可靠性。單個模塊如果可靠性小于…