Мне удалось решить проблему. Я объясню, как использовать простой пользовательский валидатор для поля возраста, который должен быть> 18 для Сотрудника. Далее предполагается, что валидатор уже был объявлен в validators.xml и отображен в действии, и в случае ValidationException сообщение «Сотрудник должен быть старше 18 лет».
Используя Firebug, я выяснил, что идентификатором области ошибки в форме является FormError. Можно настроить функцию обратного вызова errorTextFormat в jqgrid, чтобы получить ответ от сервера и обработать его. В конфигурации jqgrid можно написать
errorTextFormat : errorFormat,
с
var errorFormat = function(response) {
var text = response.responseText;
$('#FormError').text(text); //sets the text in the error area to the validation //message from the server
return text;
};
Проблема теперь в том, что сервер неявно отправит ответ, содержащий всю трассировку стека исключений. Чтобы справиться с этим, я решил создать новый тип результата.
public class MyResult implements Result {
/**
*
*/
private static final long serialVersionUID = -6814596446076941639L;
private int errorCode = 500;
public void execute(ActionInvocation invocation) throws Exception {
ActionContext actionContext = invocation.getInvocationContext();
HttpServletResponse response = (HttpServletResponse) actionContext
.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse");
Exception exception = (Exception) actionContext
.getValueStack().findValue("exception");
response.setStatus(getErrorCode());
try {
PrintWriter out = response.getWriter();
out.print(exception.getMessage());
} catch (IOException e) {
throw e;
}
}
/**
* @return the errorCode
*/
public int getErrorCode() {
return errorCode;
}
/**
* @param errorCode the errorCode to set
*/
public void setErrorCode(int errorCode) {
this.errorCode = errorCode;
}
}
Он также должен быть настроен в struts.xml следующим образом:
<package name="default" abstract="true" extends="struts-default">
...
<result-types>
<result-type name="validationError"
class="exercises.ex5.result.MyResult">
</result-type>
</result-types>
...
<action name="myaction">
...
<result name="validationException" type="validationError"></result>
<exception-mapping result="validationException"
exception="java.lang.Exception"></exception-mapping>
</action>
...
</package>
Это шаги, которые я выполнил, чтобы получить сообщение об ошибке проверки в окне добавления / редактирования, и теперь оно работает.