我正在制作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."]}
如果可能,我真的希望响应中包含操作错误和字段错误。
有什么想法吗?非常感谢你提前!!
修改
我想我可能需要利用某种正则表达式......我试过了:
<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返回?
答案 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>