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

12

我正在进行 JQuery Ajax post 请求,希望任何 actionmessagesactionerrorsfielderrors 都能以 JSON 格式添加到响应中的 action 中。

我添加了以下结果:

<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":["您必须提供正确的信息。"]}

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

有什么想法吗?非常感谢您的帮助!

编辑:
我认为我可能需要使用某种正则表达式……我尝试过:

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

我猜想如果堆栈上存在字段错误/操作错误,它们将作为JSON返回?

2个回答

10

我找到了如何在JSON结果中返回ActionErrors、ActionMessages和FieldErrors的方法!

以下是一个示例包- 我设置了一个全局错误处理程序,它将ActionErrors、FieldErrors和ActionMessages作为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);  
    });  
}

谢谢!我没有将ignoreHierarchy参数设置为false。 - Beez

6
includeProperties参数可以稍微缩短一下,使用以下语法即可:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接