首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Spring 專案部署 Resin 4 無法注入 Bean 排查:通配符掃描路徑失效

     編輯:Java 綜合教學

問題現象

Spring 專案在測試環境 Tomcat 正常,部署到客戶現場 Resin 4.0.49 啟動報錯:

org.springframework.beans.factory.NoSuchBeanDefinitionException: 
No qualifying bean of type [xxx.Service] found for dependency

大量 Bean 找不到、注入失敗。

排查過程

  1. 確認 JDK 版本、Resin 版本、依賴包一致
  2. 本地復現:Resin 4.0.13 正常,4.0.49 失敗 → **Resin 版本差異**
  3. 嘗試 Tomcat 部署正常 → **Resin 特有問題**
  4. 檢查 web.xml Spring 配置加載路徑

根因定位

<!-- 問題配置:通配符掃描 -->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext*.xml</param-value>
</context-param>

Resin 4.0.49 類加載器對 classpath:* 通配符解析行為變更,導致無法掃描到多個 applicationContext-*.xml,Spring 容器啟動時 Bean 定義為空。

解決方案

<!-- 修改為具體檔案清單,逗號分隔 -->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext-dao.xml,classpath:applicationContext-service.xml,classpath:applicationContext-web.xml</param-value>
</context-param>

重啟 Resin,**問題解決**,所有 Bean 正常注入。

深度分析:為什麼 Resin 行為不同?

  • Spring 使用 PathMatchingResourcePatternResolver 解析 classpath*:
  • 依賴 `ClassLoader.getResources(path)` 獲取資源 URL 列表
  • Resin 4.0.49 類加載器實現細節變更,可能:
  • 不支援 `classpath*:` 前綴的多路徑掃描
  • 資源 URL 協議處理差異 (resin:/ vs jar:/ vs file:/)
  • 類加載器層級隔離導致可見資源範圍縮小

最佳實踐建議

  1. 避免通配符:生產環境明確列出所有配置檔案
  2. 統一配置檔:合併為單一 applicationContext.xml 引入其他
  3. Spring Boot 遷移:`@SpringBootApplication` + `application.yml` 完全規避此類問題
  4. 容器兼容性測試:CI 階段針對目標容器 (Tomcat/Resin/Jetty/Undertow) 執行整合測試

對比驗證

容器版本classpath:* 掃描備註
Tomcat8.5/9.0✅ 正常標準實現
Resin4.0.13✅ 正常舊版本相容
Resin4.0.49❌ 失效類加載器變更
Jetty9.4✅ 正常標準實現
Undertow2.0✅ 正常WildFly 內建

總結

**Spring `classpath:*` 通配符掃描在特定容器版本不可靠**。生產部署務必使用**明確檔案列表**或**單一配置檔**。此問題揭示了容器類加載器實現差異對框架行為的影響,也是遷移 Spring Boot 的強力理由之一。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved