依據訊息來看,最大的可能是 struts.xml 沒有定義到 action,但是我 struts.xml 一個字一個字的檢查的十幾次,怕 class 打錯還特別從 source 檔 copy / paste 上去還是錯,最後找到的原因是 form tag 和 action setter 資料型態的的問題。
錯誤示範一、
<s:textarea name=”person.description”/>
person 是 hibernate tool 產生的物件,description 是 SQL 2000 ntext 欄位,java 資料型態是 java.sql.Clob,沒有轉換型態直接塞入物件就會 Could not find action 。
錯誤示範二、
<s:head theme=”ajax”/>
<s:datetimepicker name=”person.birthday”/>
birthday 是 SQL 2000 datetime 欄位,java 資料型態是 java.util.Date,同樣的直接塞進物件的結果和上個例子一樣,struts datetimepicker tag 文件有提到要先用 SimpleDateFormat 處理 submit 的資料。
2008.11.11 補充
不論是 portlet 或 struts web application 開發都有機會遇到 Could not find action 或 There is no Action mapped for action 的問題,目前整理 troubleshooting 的 checklist 如下:
- struts 的 include 檔案是否都有正確 include 到,是否檔名打錯了
- action 是否有 compile error 或資料型態轉換問題
- 當 struts 的 package 有定義 namespace 時請使用絕對路徑,少用相對路徑,會減少很多的困擾