Múltiples puntos de entrada en la acción de Struts (Migración de Struts 2.2.3 -> 2.3.1)
Pregunta
Tengo una acción en struts.xml
<action name="reprint" class="reprintAction">
<result name="success" type="redirectAction">
<param name="actionName">reprint</param>
<param name="namespace">/x</param>
<param name="errorFlag">${errorFlag}</param>
<param name="message">${message}</param>
</result>
<result name="view">/jsp/reprintOverview.jsp</result>
</action>
un JSP:
<s:form action="reprint">
<s:select name="selectedPdfPrinter" list="shopPdfPrinterList" listKey="deviceId" listValue="deviceId" theme="simple"/>
<s:submit value="Print" theme="simple" method="shopPdfReprint"/>
</s:form>
con varios elementos de forma, todos vinculados a una acción.Cada formulario tiene un botón de envío individual con un distintivo method
(p.ej."tiendaPdfReprint").Cada method
se asigna a un método en la clase correspondiente.
Todo funciona bien con Struts 2.2.3.Pero después de la migración a 2.3.1, la asignación de métodos no funciona.En lugar de llamar al método correspondiente (p. ej."shopPdfReprint"), sólo el execute
-Se invoca el método de la clase.
He mirado los documentos, pero desafortunadamente no he encontrado ni idea, ¿cómo adaptarse a 2.3.1 alguien se encontró con esto?Se agradece la ayuda :]
Solución
Esto sucede porque has desactivado DMI.El method
El atributo funciona con la etiqueta de envío como antes, incluso después de reenviar correcciones de seguridad.Habilite DMI usando la constante
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
avíseme si no funcionó.
Otros consejos
Si alguien se está moviendo o trabajando en Struts 2.5, entonces no tiene que asignar acciones usando struts.xml.Strtus 2.5 se basa en anotaciones, por lo que el desarrollador de clases de acción puede asignar múltiples acciones dentro de una sola clase mediante anotaciones.
Puede que este enlace sea útil desde las versiones antiguas de struts hasta la versión 2.5 de struts.
https://struts.apache.org/docs/struts-23-to-25-migration.html
A continuación se muestra el código de demostración simple.
package com.stsh.action;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import com.opensymphony.xwork2.ActionSupport;
import com.stsh.intercepter.AuthRequired;
@ParentPackage(value="default")
@Namespace(value="/dashboard")
public class DashboardAction extends ActionSupport implements AuthRequired{
private static final long serialVersionUID = 1L;
@Action(value = "home", results = { @Result(name = "success", location = "dashboard.tiles", type = "tiles") })
public String dashboard(){
return "success";
}
}