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

时间:2011-03-25 01:12:30

标签: ajax json validation plugins struts2

我正在制作JQuery Ajax帖子,并希望在响应中以JSON格式添加任何actionmessagesactionerrorsfielderrors

我添加了这个结果:

<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."]}

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

有什么想法吗?非常感谢你提前!!

修改
我想我可能需要利用某种正则表达式......我试过了:

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

结果相同:

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

我还发现了这个bug report,这可能是我在使用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 个答案:

答案 0 :(得分: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>

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

答案 1 :(得分:6)

可以使用以下方法稍微缩短includeProperties参数:

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