Плагин Struts2 JSON: добавление ActionMessages, ActionErrors и FieldErrors к ответу - PullRequest
12 голосов
/ 25 марта 2011

Я делаю посты JQuery Ajax и хотел бы, чтобы любые actionmessages, actionerrors и fielderrors были добавлены в действие назад в ответе (в формате JSON).

Я добавил этот результат:

<result name="input" type="json">    
    <param name="ignoreHierarchy">false</param>  
    <param name="includeProperties">fieldErrors,actionErrors</param>  
</result>

к моей конфигурации действий в struts.xml.

Я получаю: {"actionErrors":[],"fieldErrors":{}} обратно как ответ, несмотря на наличие ошибок поля в стеке значений.

Если я изменю свою конфигурацию результатов на:

<result name="input" type="json">    
    <param name="ignoreHierarchy">false</param>  
    <param name="root">fieldErrors</param>  
</result>

ответ JSON ожидаемый:
{"thePropertyWithValidationError":["You must supply correct information."]}

Мне бы очень хотелось, чтобы как ошибки действий, так и ошибки полей были включены в ответ, если это возможно.

Есть идеи? Заранее большое спасибо !!

Edit:
Я думаю, что мне может понадобиться использовать какое-то регулярное выражение ... Я попытался:

<result name="input" type="json">    
    <param name="ignoreHierarchy">false</param>  
    <param name="includeProperties">fieldErrors\[\d+\],actionErrors\[\d+\]</param>  
</result>

с тем же результатом:

{"actionErrors":[],"fieldErrors":{}}

Я также нашел это сообщение об ошибке , которое может способствовать моим проблемам, так как я использую Struts v2.2.1. (v2.2.2 еще не вышел)

Редактировать # 2:

Возможно, JSONValidationInterceptor - это то, что мне нужно ... Кажется, я не могу понять, как использовать его с моими пользовательскими сообщениями JQuery Ajax ...

Я использую перехватчик json для заполнения своих свойств. Ниже приведена конфигурация моего действия:

<action name="MyAction" method="add" class="com.test.actions.MyAction">
    <interceptor-ref name="json" />
    <interceptor-ref name="jsonValidationWorkflowStack"/>
    <interceptor-ref name="MyCustomInterceptor" />  
    <result name="success" type="json" />
</action>  

Я пишу: {"struts.enableJSONValidation":"true", "testProperty":"true"}

Ответ просто пересылается на мое глобальное отображение результатов error.jsp (с ошибками поля, отображаемыми в том виде, в котором я настроил их отображение в error.jsp):

<global-results>   
    <result name="error">/WEB-INF/jsp/error.jsp</result>  
    <result name="Exception">/WEB-INF/jsp/error.jsp</result>  
</global-results>  
<global-exception-mappings>  
    <exception-mapping exception="java.lang.Throwable" result="Exception" />  
</global-exception-mappings>  

Полагаю, я ожидал, что если в стеке появятся fielderrors / actionerrors, они будут возвращены как JSON?

Ответы [ 2 ]

10 голосов
/ 19 апреля 2011

Я выяснил, как вернуть ActionErrors, ActionMessages и FieldErrors в результате JSON!

Ниже приведен пример пакета - я установил глобальный обработчик ошибок, который выплевывает ошибки действий, ошибки полей,и сообщения о действиях в виде JSON:

<!--myBase has interceptor stack defined-->
<package name="JsonResults" namespace="/json" extends="myBase">

<global-results>
    <result name="input" type="json">
        <param name="ignoreHierarchy">false</param>
        <param name="includeProperties">actionErrors\[\d+\], fieldErrors\..+$, actionMessages\[\d+\]</param>
    </result>
    <result name="error" type="json">
        <param name="ignoreHierarchy">false</param>
        <param name="includeProperties">actionErrors\[\d+\], fieldErrors\..+$, actionMessages\[\d+\]</param>
    </result>
    <result name="Exception" type="json">
        <param name="ignoreHierarchy">false</param>
        <param name="includeProperties">actionErrors\[\d+\], fieldErrors\..+$, actionMessages\[\d+\]</param>
    </result>
</global-results>
<global-exception-mappings>
    <exception-mapping exception="java.lang.Throwable" result="Exception" />
</global-exception-mappings>

<!-- sample action -->  
<action name="SampleAction" method="loadSamples" class="com.sample">
    <result name="success" type="json">
        <param name="ignoreHierarchy">false</param>
        <param name="includeProperties">sampleComplexBean\[\d+\]\..+$, actionMessages\[\d+\]</param>
    </result>   
</action>
</package>

Я могу проверить свой JQuery Javascript на наличие ошибок действия или ошибок на местах:

/**
 * Checks the passed in json and searches for the 
 * existence of an "actionErrors" or "fieldErrors" objects
 * 
 * @param json          The JSON to check for errors
 * @returns {Boolean}   true if errors exist; false otherwise
 */
function areActionOrFieldErrorInJson(json) {

    var errorsExist = false;

    if ( json != null && ( json.actionErrors != null || json.fieldErrors != null ) ) {
        errorsExist = true;
    }

    return errorsExist;
}  

или выполнить цикл следующим образом:

if ( json.actionErrors != null && json.actionErrors.length !== 0 ) {  
    $.each(json.actionErrors, function(e) {  
        doStuff(this);  
    });  
}
6 голосов
/ 29 июня 2012

Параметр includeProperties можно немного сократить, используя:

<result name="error" type="json">
    <param name="ignoreHierarchy">false</param>
    <param name="includeProperties">
        actionErrors.*,
        actionMessages.*,
        fieldErrors.*
    </param>
</result>
...