controles componentes clase caracteristicas java struts2 model-driven struts2-interceptors interceptorstack

clase - componentes swing java pdf



Excepción inesperada capturada configurando ''xxx'' en ''clase xxx: Error al establecer la expresión'' xxx ''con el valor (1)

Aquí no hay ningún problema de matriz (aunque parezca así): este tipo de excepción significa que Struts no puede encontrar un Setter para su parámetro:

De la documentación de ParametersInterceptor :

Advertencia sobre los parámetros faltantes

Cuando no se establece un determinado nombre de parámetro, se registrará un mensaje de advertencia como el siguiente en devMode:

SEVERE: Developer Notification (set struts.devMode to false to disable this message): Unexpected Exception caught setting ''search'' on ''class demo.ItemSearchAction: Error setting expression ''search'' with value [''search'', ] Error setting expression ''search'' with value [''search'', ] - [unknown location] at com.opensymphony.xwork2.ognl.OgnlValueStack.handleRuntimeException(OgnlValueStack.java:201) at com.opensymphony.xwork2.ognl.OgnlValueStack.setValue(OgnlValueStack.java:178) at com.opensymphony.xwork2.ognl.OgnlValueStack.setParameter(OgnlValueStack.java:152)

Por lo tanto, se espera que el comportamiento permita al desarrollador detectar el setter o error tipográfico faltante en el nombre del parámetro o en el setter.

Puede reproducir fácilmente este error poniendo un elemento en JSP que no exista en la Acción.

Como sus propiedades existen (con sus Setters) en el Modelo, y está utilizando ModelDriven y paramsPrepareParamsStack , lo que creo que está sucediendo es:

  • ModelDriven Interceptor se delega para manejar el objeto Modelo;
  • La primera vez que llama a Parameters Interceptor , el ModelDriven Interceptor no se ha ejecutado todavía;
  • Entonces su Acción no sabe nada sobre el objeto Modelo, y trata de encontrar los Setters para sus parámetros en la Acción, NO en el Modelo.
  • El segundo interceptor en su lugar se ejecuta después del ModelDriven, y sabe exactamente dónde establecer los parámetros. Es por eso que tiene los parámetros establecidos correctamente en el método de Acción.

Pero si esto es cierto, entonces NO deberías poder recuperar esos parámetros en el método prepare() (esa es la razón por la que estás usando esta pila ...):
por favor, inténtalo y publica aquí el resultado.

Lo primero que me viene a la mente para resolver este problema es colocar el ModelDriven Interceptor antes del primer Parameters Interceptor (ya sea copiándolo o moviéndolo, no estoy seguro de qué tipo de efecto secundario, si lo hay, podría producir en ambos casos, deberías probar y reportarlo aquí).

Luego defina la siguiente pila y úselo.

<interceptor-stack name="modelParamsPrepareParamsStack"> <interceptor-ref name="exception"/> <interceptor-ref name="alias"/> <interceptor-ref name="i18n"/> <interceptor-ref name="checkbox"/> <interceptor-ref name="multiselect"/> <!-- NEW ModelDriven Position --> <interceptor-ref name="modelDriven"/> <interceptor-ref name="params"> <param name="excludeParams">^dojo/..*,^struts/..*,^session/..*,^request/..*,^application/..*,^servlet(Request|Response)/..*,^parameters/..*,^action:.*,^method:.*</param> </interceptor-ref> <interceptor-ref name="servletConfig"/> <interceptor-ref name="prepare"/> <interceptor-ref name="chain"/> <!-- OLD ModelDriven Position --> <!--interceptor-ref name="modelDriven"/--> <interceptor-ref name="fileUpload"/> <interceptor-ref name="staticParams"/> <interceptor-ref name="actionMappingParams"/> <interceptor-ref name="params"> <param name="excludeParams">^dojo/..*,^struts/..*,^session/..*,^request/..*,^application/..*,^servlet(Request|Response)/..*,^parameters/..*,^action:.*,^method:.*</param> </interceptor-ref> <interceptor-ref name="conversionError"/> <interceptor-ref name="validation"> <param name="excludeMethods">input,back,cancel,browse</param> </interceptor-ref> <interceptor-ref name="workflow"> <param name="excludeMethods">input,back,cancel,browse</param> </interceptor-ref> </interceptor-stack>

Espero que ayude.

Estoy pasando algunos parámetros a una clase de acción que implementa ModelDriven<Transporter> través de una cadena de consulta.

<s:form namespace="/admin_side" action="Test" id="dataForm" name="dataForm"> <s:url id="editURL" action="EditTest" escapeAmp="false"> <s:param name="transporterId" value="1"/> <s:param name="transporterName" value="''DHL''"/> </s:url> <s:a href="%{editURL}">Click</s:a> </s:form>

La clase de acción es la siguiente.

@Namespace("/admin_side") @ResultPath("/WEB-INF/content") @ParentPackage(value = "struts-default") public final class TestAction extends ActionSupport implements Serializable, Preparable, ModelDriven<Transporter> { private static final long serialVersionUID = 1L; private Transporter transporter = new Transporter(); @Action(value = "Test", results = { @Result(name = ActionSupport.SUCCESS, location = "Test.jsp"), @Result(name = ActionSupport.INPUT, location = "Test.jsp")}, interceptorRefs = { @InterceptorRef(value = "paramsPrepareParamsStack", params = {"params.acceptParamNames", "transporterId, transporterName"})}) public String load() throws Exception { return ActionSupport.SUCCESS; } @Action(value = "EditTest", results = { @Result(name = ActionSupport.SUCCESS, location = "Test.jsp"), @Result(name = ActionSupport.INPUT, location = "Test.jsp")}, interceptorRefs = { @InterceptorRef(value = "paramsPrepareParamsStack", params = {"params.acceptParamNames", "transporterId, transporterName"})}) public String edit() { System.out.println(transporter.getTransporterId() + " : " + transporter.getTransporterName()); return ActionSupport.SUCCESS; } @Override public Transporter getModel() { return transporter; } @Override public void prepare() throws Exception {} }

El terminal del servidor muestra los siguientes mensajes.

Jan 09, 2014 4:06:32 PM com.opensymphony.xwork2.interceptor.ParametersInterceptor error SEVERE: Developer Notification (set struts.devMode to false to disable this message): Unexpected Exception caught setting ''transporterId'' on ''class actions.TestAction: Error setting expression ''transporterId'' with value [''1'', ] Jan 09, 2014 4:06:32 PM com.opensymphony.xwork2.interceptor.ParametersInterceptor error SEVERE: Developer Notification (set struts.devMode to false to disable this message): Unexpected Exception caught setting ''transporterName'' on ''class actions.TestAction: Error setting expression ''transporterName'' with value [''DHL'', ]

Aunque el nivel de registro es SEVERE , los valores de estos parámetros están disponibles en la clase de acción como

System.out.println(transporter.getTransporterId() + " : " + transporter.getTransporterName());

en el método edit()

Si paramsPrepareParamsStack se reemplaza por defaultStack , estos mensajes desaparecerán.

Expresiones como [''DHL'', ] indican una matriz. transporterId y transporterName en el modelo son, sin embargo, de tipo Long y String respectivamente.

¿Qué estoy haciendo mal?