java json struts2 interceptor actionresult

java - Obteniendo Tipo de resultado en Interceptor



json struts2 (2)

Tengo acciones de Struts2 con diferentes tipos de resultados (HTML y JSON). Usan un interceptor común.

Si es necesario para interceptar la solicitud, ¿cómo devolver el resultado en función del tipo de resultado de acción determinado?

Por ejemplo, mi Action.ERROR reenvía a la página JSP. Si la acción es de tipo JSON, deseo reenviar el error JSON.


En Struts2 la acción no tiene un tipo. Esto significa que no puede configurar el tipo de acción. En su lugar, puede configurar los tipos de resultados en la configuración xml. En el archivo de configuración xml esto se define como la etiqueta de result-type . Cuando configura el resultado usando la etiqueta de result , especifica el atributo de type que se utilizará para determinar el tipo de resultado correspondiente. Say name="success" o name="error" son los resultados del tipo de resultado del dispatcher .

Cuando la acción es interceptada, puedes obtener los resultados

Map<String, ResultConfig> results = actionInvocation.getProxy().getConfig().getResults();

En el ResultConfig hay un atributo className que podría usarse para determinar el tipo del resultado.


Tengo acciones de Struts2 con diferentes tipos de resultados (HTML y JSON). Usan un interceptor común. Si es necesario interceptar la solicitud, ¿cómo devolver el resultado en función del tipo de resultado de acción determinado?

Por ejemplo, mi Action.ERROR reenvía a la página JSP. Si la acción es de tipo JSON, deseo reenviar el error JSON. Por favor aconséjame.

Aunque es cierto que una Acción no tiene un tipo , también es cierto que, si se llama a una Acción de manera AJAX, como una acción que devuelve JSON, todos sus resultados deben tener el mismo tipo de resultado (JSON en este caso), a menos que está utilizando una sola Acción para realizar diferentes acciones lógicas (operaciones ajax y no ajax, que es un antipatrón);

Dicho esto, si desea devolver el resultado de error GLOBAL correcto, desde dentro de un Interceptor que es utilizado por todas sus Acciones (cada una con su tipo de resultado), en función de su otro tipo de resultado (digamos: SUCCESS , asumiendo cada Acción tiene un resultado de SUCCESS ), esta es la manera de hacerlo:

public String intercept(ActionInvocation invocation) throws Exception { // Get the action configuration defined in struts.xml ActionConfig config = invocation.getProxy().getConfig(); // Get the SUCCESS result configured for that Action ResultConfig success = config.getResults().get("success"); // Get the class of the SUCCESS result Object clazz = success.getClass(); /* .... oops, some error occurred !! We now need to redirect to the right global error result .... */ if (clazz instanceof org.apache.struts2.dispatcher.ServletDispatcherResult) { log.debug("Struts2 Result type: CLASSIC"); return "error"; } else if (clazz instanceof org.apache.struts2.json.JSONResult) { log.debug("Struts2 Result type: JSON"); return "jsonError"; } else { log.debug("Struts2 Result type: SOMETHING ELSE, returning default "); return "error"; } }

Aunque esto es técnicamente posible, lo desalentaría porque ... no hay una razón real para hacerlo;

Para su propósito, recuerde que cada resultado global tiene un alcance en su <package> ;

Como podría (/ debería) tener dos paquetes diferentes para Acciones clásicas (un <package> extiende struts-default ) y Acciones JSON (un <package> extiende json-default ), simplemente puede definir dos resultados de error global diferentes para cada paquete con el mismo nombre pero diferente tipo de resultado ; de esta forma, el Interceptor llamará al relativo al paquete de la Acción actual, dando como resultado el tipo de resultado deseado.