2016-11-10 5 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, которая не является неправильным, но которое само по себе не достаточно, чтобы знать, какой из них между INPUT и через SUCCESS результаты были возвращены.

Ошибки преобразования и ошибки проверки поля содержат сообщения об ошибках на карте 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», поэтому это не проблема. В конечном счете, я столкнулся с проблемой, изменив поле на String и добавив валидацию, чтобы обеспечить ввод числа. – rmaitipe