Struts2 JSON插件:将ActionMessages,ActionErrors和FieldErrors添加到响应中

ica*_*ats 12 validation ajax plugins json struts2

我正在制作JQuery Ajax帖子,并希望任何actionmessages,actionerrorsfielderrors在响应中添加到操作中(以JSON格式).

我添加了这个结果:

<result name="input" type="json">    
    <param name="ignoreHierarchy">false</param>  
    <param name="includeProperties">fieldErrors,actionErrors</param>  
</result>
Run Code Online (Sandbox Code Playgroud)

到我的动作配置struts.xml.

我得到了:{"actionErrors":[],"fieldErrors":{}}尽管在值堆栈上存在字段错误,但作为响应返回.

如果我将结果配置更改为:

<result name="input" type="json">    
    <param name="ignoreHierarchy">false</param>  
    <param name="root">fieldErrors</param>  
</result>
Run Code Online (Sandbox Code Playgroud)

JSON响应是我预期的::
{"thePropertyWithValidationError":["You must supply correct information."]}

如果可能的话,我真的希望响应中包含操作错误和字段错误.

有任何想法吗?非常感谢你提前!!

编辑:
我想我可能需要利用某种正则表达式......我试过:

<result name="input" type="json">    
    <param name="ignoreHierarchy">false</param>  
    <param name="includeProperties">fieldErrors\[\d+\],actionErrors\[\d+\]</param>  
</result>
Run Code Online (Sandbox Code Playgroud)

结果相同:

{"actionErrors":[],"fieldErrors":{}}
Run Code Online (Sandbox Code Playgroud)

我还发现了这个错误报告,当我使用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>  
Run Code Online (Sandbox Code Playgroud)

我发布: {"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>  
Run Code Online (Sandbox Code Playgroud)

我想我期待如果堆栈上有fielderrors/actionerrors,它们将作为JSON返回?

ica*_*ats 10

我想出了如何在JSON结果中返回ActionErrors,ActionMessages和FieldErrors!

下面是一个示例包 - 我设置了一个全局错误处理程序,它将操作错误,字段错误和操作消息吐出为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>
Run Code Online (Sandbox Code Playgroud)

如果存在操作错误或字段错误,我可以检查我的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;
}  
Run Code Online (Sandbox Code Playgroud)

或循环遍历它们如下:

if ( json.actionErrors != null && json.actionErrors.length !== 0 ) {  
    $.each(json.actionErrors, function(e) {  
        doStuff(this);  
    });  
}
Run Code Online (Sandbox Code Playgroud)


Bee*_*eez 6

可以使用以下命令略微缩短includeProperties参数:

<result name="error" type="json">
    <param name="ignoreHierarchy">false</param>
    <param name="includeProperties">
        actionErrors.*,
        actionMessages.*,
        fieldErrors.*
    </param>
</result>
Run Code Online (Sandbox Code Playgroud)