2016-11-10 58 views
0

我遇到了一個場景,如果允許編輯項目的表單有一個空字段,則不會調用Struts動作。該頁面通過freeMarker模板進行自定義。調用到達攔截器併成功傳遞,然後在調用操作方法之前被放棄。正因爲如此,我沒有看到任何錯誤消息來弄清楚什麼是錯誤的。 如果該字段不爲空,則該操作會通過,並且該項目會更新。Struts 2沒有被調用的動作

這是我的攔截器的Struts配置,它似乎很好。

<interceptors> 
    <interceptor name="loginInterceptor" class="login.interceptor.LoginInterceptor" />  
    <interceptor-stack name="appStack"> 
     <interceptor-ref name="defaultStack"/> 
     <interceptor-ref name="loginInterceptor"/> 
    </interceptor-stack> 
</interceptors> 
<default-interceptor-ref name="appStack" /> 

而且這是在struts.xml中的作用

<action name="upDate" method="upDate" class="com.coll.Item"> 
    <result name="success">jsp/item.jsp</result> 
    <result name="input">jsp/item.jsp</result> 
</action> 

在item.ftl領域看起來像這樣

<tr>   
    <td>Prior Order Number</td> 
    <td><@s.textfield name="item.prevOrdNum" id="prevOrdNum" theme="simple"/></td> 
</tr> 

另一個令人費解的因素是因爲這是一個小的內部應用程序它沒有更新多年,但這個問題幾個星期前就開始了。如果我在網頁中完全刪除該字段,或者如果我在數據庫中爲該字段添加值,則在加載時它不會爲空 - 更新會通過。我會很感激任何想法,可以解釋發生了什麼。

+0

你給出的代碼是否定的足以給你想法,你只能猜測它,永遠不會解決。 –

回答

1

你最有可能在下列情形之一的結尾:

  • 一個轉換錯誤,因爲你的變量是一個原始的號碼,你發送一個空,這是不允許的,或
  • a 驗證錯誤,因爲您有一些驗證某處(validate()方法,XML,註釋等),指定該字段不能爲空。

In either case, the Workflow interceptor will return an INPUT result,你已經映射到同一個JSP頁面,這是沒有錯的,但是這是不夠知道其中INPUTSUCCESS結果之間的一個已經歸還。

轉換錯誤和字段驗證錯誤在FieldErrors映射中攜帶錯誤消息,而不是在ActionErrors中(您可能在頁面頂部使用<s:actionerror /> tag打印)。

使用默認主題XHTML,每個fieldError打印在它所屬的字段附近;但是您已將simple主題用於您的標記,因此字段錯誤不會自動打印。

你有兩個選擇:在頁面的頂部

  1. 打印所有領域的錯誤:

    <style type="text/css"> 
        .error { border: 5px solid red; } 
    </style> 
    
    <@s.if test="hasFieldErrors()"> 
        <div class="error"> 
         <@s.fielderror /> 
        </div> 
    </@s.if> 
    
  2. 或手動連接<s:fielderror/> tags到您的領域:

    <tr>   
        <td>Prior Order Number</td> 
        <td> 
         <@s.textfield name="item.prevOrdNum" id="prevOrdNum" theme="simple"/> 
         <@s.fielderror fieldName="item.prevOrdNum" /> 
        </td> 
    </tr> 
    
+0

現在嘗試第二個建議後,我看到item.prevOrdNum消息的無效字段值。當它試圖將它轉換爲Integer時,它的起源是因爲當我將字段類型更改爲String時,它消失了。但它不是源於提交之前發生的表單驗證,因爲我已將其刪除並仍然發生。我沒有任何'@Column(nullable = false)'這個字段的註釋,所以我很遺憾什麼時候發生。 – rmaitipe

+0

我打算接受這個答案,因爲它符合問題的原始範圍,並指示我查看找到解決方案時出了什麼問題。我的服務器端變量是'Integer',所以這不是問題。最終,我通過將字段更改爲字符串並添加驗證來確保輸入是數字來解決問題。 – rmaitipe