2011-03-25 25 views
12

FieldErrors我提出的JQuery Ajax的職位,並希望任何actionmessagesactionerrorsfielderrors在行動早在響應(JSON格式)加入。在struts.xmlStruts2的JSON插件:添加ActionMessages,的ActionErrors,並響應

<result name="input" type="json">  
    <param name="ignoreHierarchy">false</param> 
    <param name="includeProperties">fieldErrors,actionErrors</param> 
</result> 

我的操作配置:

我加了這個結果。

我得到:{"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的阿賈克斯用它帖子...

我使用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頁面來顯示顯示字段錯誤):

我猜我期待如果堆棧上有Fielderrors/actionerrors,它們將作爲JSON返回?

回答

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); 
    }); 
} 
+0

謝謝!我沒有將ignoreHierarchy參數設置爲false。 – Beez 2012-06-29 18:13:01

6

includeProperties參數可以使用以下幾個參數縮短:

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