2011-03-25 11 views
12

estoy haciendo JQuery Ajax mensajes y les gustaría cualquier actionmessages, actionerrors y fielderrors añadido a la acción de regreso en la respuesta (en formato JSON).Struts2 JSON Plugin: ActionMessages Adición, ActionErrors y FieldErrors a la respuesta

que añade este resultado:

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

a mi configuración de la acción en el struts.xml.

Obtengo: {"actionErrors":[],"fieldErrors":{}} como respuesta, a pesar de que haya errores de campo en la pila de valores.

Si cambio de configuración resultado de:

<result name="input" type="json">  
    <param name="ignoreHierarchy">false</param> 
    <param name="root">fieldErrors</param> 
</result> 

la respuesta JSON es que esperaba ::
{"thePropertyWithValidationError":["You must supply correct information."]}

Realmente me gustaría que ambos errores de acción y los errores de campo incluidos en la respuesta, si posible.

¿Alguna idea? ¡¡Muchas gracias de antemano!!

Editar:
Creo que puede que tenga que utilizar algún tipo de expresión regular ... He intentado:

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

con el mismo resultado:

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

También encontré esto bug report, que puede estar contribuyendo a mis problemas ya que estoy usando Struts v2.2.1. (V2.2.2 aún no está fuera)

Edición # 2:

Quizás el JSONValidationInterceptor es lo que necesito ... Me parece que no puede encontrar la manera de usarlo con mi costumbre jQuery Ajax mensajes ...

estoy usando el interceptor JSON para poblar mis propiedades de abajo es mi configuración de la acción:

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

estoy publicando: {"struts.enableJSONValidation":"true", "testProperty":"true"}

La respuesta es simplemente reenvía a los resultados de la cartografía mundial, error.jsp (con los errores de campo que se muestran como los tengo configurado para mostrar en el error.jsp):

supongo que estaba esperando que si hubiera fielderrors/actionerrors en la pila, serían devueltos como JSON?

Respuesta

10

¡Descubrí cómo devolver ActionErrors, ActionMessages y FieldErrors en el resultado de JSON!

continuación se presenta una muestra de paquete- fijo una un controlador de errores global que escupe los errores, errores de acción de campo y mensajes de acción como 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> 

puedo comprobar en mi jQuery JavaScript si la acción existen errores o errores de campo:

/** 
* 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; 
} 

o bucle a través de ellos como sigue:

if (json.actionErrors != null && json.actionErrors.length !== 0) { 
    $.each(json.actionErrors, function(e) { 
     doStuff(this); 
    }); 
} 
+0

¡Gracias! No estaba configurando el parámetro ignoreHierarchy en falso. – Beez

6

El parámetro includeProperties se puede acortar ligeramente usando:

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