在搭建 Struts2 登入示例的過程中,踩中了兩個極具代表性的坑:Tomcat 9 與 Eclipse Neon 相容性問題,以及多源代碼整合導致的命名空間配置錯誤。記錄排查過程,為後人踩雷預警。
開發環境:Eclipse Neon Release (4.6.0) + Tomcat 9。啟動伺服器時控制台噴紅警告,卻無實質報錯,斷點調試也查不出所以然。耗時一整天無果後,嘗試回滾至 Tomcat 8.5,專案竟奇蹟般正常啟動。
經驗總結:Eclipse 舊版本對 Tomcat 9 的支援存在缺陷,若非必要,穩妥選擇 Tomcat 8.5.x 長期支援版。升級伺服器前務必確認 IDE 相容性矩陣。
從兩篇優秀博客綜合代碼時,WEB-INF/lib 目錄下出現同名不同版本的 Jar 包(如 commons-lang-2.4.jar 與 commons-lang3-3.5.jar 共存)。雖類名相同但包路徑不同,類載入器可能載入錯誤版本導致 NoSuchMethodError 或 ClassCastException。
解決原則:
mvn dependency:tree 檢測衝突,mvn dependency:analyze 發現未聲明依賴。
整合兩篇博客代碼後,請求拋出經典空指針:
嚴重: Exception occurred during processing request: null java.lang.NullPointerException at com.struts2.test.LoginAction.execute(LoginAction.java:28) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ...
錯誤行 28 為 userService.login(user),顯示 userService 未注入。對比兩篇博客的 struts.xml 發現關鍵差異:
<package name="default" namespace="/"><package name="user" namespace="/user">Action 類採用博客 B 的包結構 com.struts2.test,但 struts.xml 卻用了博客 A 的 namespace="/",導致 Spring 容器無法正確掃描注入 Service Bean。
修正後配置:
<package name="user" namespace="/user" extends="struts-default">
<action name="login" class="com.struts2.test.LoginAction" method="execute">
<result name="success">/success.jsp</result>
</action>
</package>
請求路徑相應調整為 /user/login.action,重啟即正常。

這兩個坑看似基礎,實則是「環境治理」與「配置一致性」這兩大軟體工程核心課題在微觀場景的投影。吸取教訓,後續搭建框架專案將更得心應手。