兩個月 SSH2 實戰項目(OA 系統)踩坑總結,環境:MyEclipse 8.6 + Tomcat 6.1.3 + MySQL。以下 14 個問題涵蓋 Jar 衝突、配置錯誤、事務管理、懶加載、中文亂碼等核心痛點,助你少走彎路。
NoSuchMethodError: antlr.collections.AST.getLine()原因:antlr-2.7.2.jar (Tomcat 自帶) 與 antlr-2.7.6.jar (SSH2 引入) 衝突。
解決:刪除 Tomcat 端的低版本 jar,或在 MyEclipse 中排除:Window → Preferences → Struts 2 → antlr-2.7.2 → Remove。
NullPointerException原因:調用 null 物件方法/字段。
解決:Debug 定位具體行,補齊非空判斷或修正物件初始化邏輯。
The Struts dispatcher cannot be found原因:web.xml 中 Filter 映射路徑錯誤。
解決:確保 <url-pattern>/*</url-pattern> 覆蓋所有請求。
Unknown type '246 (decimal/bigint)原因:MySQL 某字段用 decimal/bigint,Hibernate 類型映射不支援。
解決:避免使用該類型,或改用 NumericTypeDescriptor 自定義映射。
原因:相對路徑隨 Action URL 變化而失效。
解決:統一用絕對路徑:${pageContext.request.contextPath}/css/style.css,勿硬編碼專案名。
<s:textfield> 獨佔一行原因:預設 xhtml 主題自動包裝 <table><tr><td>。
解決:struts.xml 設 <constant name="struts.ui.theme" value="simple"/> 或標籤加 theme="simple"。
原因:Hibernate 事務未自動提交(預設 false)。
解決:hibernate.cfg.xml 加 <property name="connection.autocommit">true</property>,或正規配置 Spring 宣告式事務(@Transactional)。
BeanNotOfRequiredTypeException: ... must be of type [UserDaoImpl], but was [$Proxy16]原因:注入具體實現類而非介面,Spring AOP 代理導致類型不匹配。
解決:面向介面編程:@Resource UserDao userDao; (介面類型)。
The given object has a null identifier原因:自增主鍵未回傳前端,更新時缺失 ID。
解決:JSP 隱藏域保留 ID:<s:hidden name="book.bookId"/>。
解決:<img src="real.jpg" onerror="this.src='default.jpg'"> 或 JS 封裝 showerrimg(this)。
步驟:F2 改名 → 右鍵 Properties → MyEclipse → Web → 改 Web Context-root → 刪除 Tomcat 部署 → 重新部署。
原因:URL 直傳中文編碼不一致。
解決:隱藏表單提交:<input type="hidden" name="param" value="${sessionScope.param}"> + JS form.submit(),避免超鏈接直傳。
LazyInitializationException: could not initialize proxy - no Session原因:many-to-one/set 預設 lazy="proxy",Session 關閉後訪問關聯對象。
解決:映射檔設 lazy="false",或使用 Open Session In View Filter、DTO 投影查詢。
步驟:安裝 TortoiseSVN (客戶端) + Subversion (伺服端) → svnadmin create oa → svnserve -d -r oa → 配置 passwd、svnserve.conf (取消 password-db = passwd 註釋)。
總結:SSH2 整合核心在於「Jar 衝突排查」「配置細節對齊」「事務邊界清晰」「懶加載策略選型」「編碼統一」。建議新專案直接升級至 Spring Boot + MyBatis/JPA,徹底告別 XML 地獄與版本地獄。