專案需求驅動從 JSF 1.1 升級 1.2,過程暴露多項不相容變更,記錄如下供參考。
現象:1.1 正常的 Backing Bean 在 1.2 拋出實例化異常。
原因:1.1 使用反射呼叫非 public 建構子,1.2 改為要求 public 無參建構子。
解決:將所有受管 Bean 建構子改為 public。
現象:客戶端 AJAX 動態修改選項(如多級聯動)後,所有 Command 組件動作失效。
原因:1.2 Render 階段新增嚴格驗證——提交值必須在初始化選項範圍內,否則直接短路生命週期,跳過 Invoke Application。
解決:自訂 SelectOneMenu 繼承並覆寫驗證邏輯,或使用 PrimeFaces/RichFaces 等支援 AJAX 的組件庫。
現象:大量 JavaScript 直接使用自動生成的 ID(如 form:table:3:link),升級後全掛。
原因:1.2 修改 ID 生成演算法,且新增「開關」控制是否自動生成。
解決:強制指定所有組件 id 屬性,絕不依賴自動生成。
好消息:1.2 RI 內建支援 Spring VariableResolver,無需第三方 jsf-spring.jar,直接在 faces-config.xml 設定:
<application>
<variable-resolver>org.springframework.web.jsf.DelegatingVariableResolver</variable-resolver>
</application>
現象:MyFaces Core 1.2 釋出,但 Tomahawk 停留 1.1,導致上傳/下載組件無法使用。
對策:等待 Tomahawk 1.2、改用 RichFaces/PrimeFaces 對應組件、或自行回溯修復。
idpublicPhaseListener 增強