Сообщения об ошибках проверки сервера JQGrid Struts - PullRequest
1 голос
/ 10 ноября 2011

У меня есть проект, использующий Struts2 на стороне сервера, и я пытаюсь заставить его работать с jqGrid (используя формат JSON). У меня есть несколько таблиц, созданных с помощью jqGrid, и я использую кнопки добавления / редактирования / удаления из navGrid.

Основная проблема у меня связана с сообщениями об ошибках проверки сервера. Я создал собственные валидаторы, и они работают со страницами jsp, используя s: fielderror, но я не знаю, как заставить их работать для добавления / редактирования всплывающих окон из jqGrid. Мне известно, что jqGrid предоставляет пользователям настраиваемую проверку на клиенте, но у этого есть свои ограничения (подумайте о том, чтобы проверить, является ли электронная почта пользователя уникальной, вам обязательно нужно использовать базу данных для этого, или если некоторые поля зависят друг от друга и должны быть проверены вместе, например, если isManager имеет значение true, то код managerCode должен быть не пустым, и наоборот ...).

Когда я использую проверку клиента, в окне добавления / редактирования появляется сообщение всякий раз, когда возникает ошибка. Могу ли я каким-то образом отображать сообщения об ошибках проверки сервера в окне таким же образом?

1 Ответ

3 голосов
/ 14 ноября 2011

Мне удалось решить проблему. Я объясню, как использовать простой пользовательский валидатор для поля возраста, который должен быть> 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>

Это шаги, которые я выполнил, чтобы получить сообщение об ошибке проверки в окне добавления / редактирования, и теперь оно работает.

...