Spring 專案在測試環境 Tomcat 正常,部署到客戶現場 Resin 4.0.49 啟動報錯:
org.springframework.beans.factory.NoSuchBeanDefinitionException:
No qualifying bean of type [xxx.Service] found for dependency
大量 Bean 找不到、注入失敗。
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 正常注入。
PathMatchingResourcePatternResolver 解析 classpath*:applicationContext.xml 引入其他| 容器 | 版本 | classpath:* 掃描 | 備註 |
|---|---|---|---|
| Tomcat | 8.5/9.0 | ✅ 正常 | 標準實現 |
| Resin | 4.0.13 | ✅ 正常 | 舊版本相容 |
| Resin | 4.0.49 | ❌ 失效 | 類加載器變更 |
| Jetty | 9.4 | ✅ 正常 | 標準實現 |
| Undertow | 2.0 | ✅ 正常 | WildFly 內建 |
**Spring `classpath:*` 通配符掃描在特定容器版本不可靠**。生產部署務必使用**明確檔案列表**或**單一配置檔**。此問題揭示了容器類加載器實現差異對框架行為的影響,也是遷移 Spring Boot 的強力理由之一。