Подтвердить что ты не робот

Struts2 JSON Plugin: добавление ActionMessages, ActionErrors и FieldErrors к ответу

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

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

<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>  

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

4b9b3361

Ответ 1

Я понял, как вернуть 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);  
    });  
}

Ответ 2

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

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