Estoy tratando de usar la validación Ajax en mi aplicación web Struts2 (con el complemento JQuery) y tengo un problema.Struts 2 Ajax Validation con jsonValidationWorkflowStack y Model Driven
Tuve problemas al usar las anotaciones @Validations, así que simplemente anulé el método validate() y todo funciona bien con mis formularios xhtml ahora durante la validación. Los fieldsErrors son bien recibidos e impreso en la GUI.
El hecho es que cuando se valida el formulario, un segundo puesto se envía al servidor para iniciar la acción. Pero, no sé por qué, el marco no establece los atributos del modelo y durante la generación de la respuesta HTML después de la ejecución de la Acción, el marco no puede acceder a los atributos (solo cuando uso jsonValidationWorkflowStack).
He creado un ejemplo sencillo:
La acción
@Namespace("/actions")
@ParentPackage("actions")
@InterceptorRef(value = "jsonValidationWorkflowStack")
public class ActionTest extends ActionSupport implements
ModelDriven<ModelTest>, ParameterAware {
private static final long serialVersionUID = 1L;
private ModelTest model;
private Map<String, String[]> parameters;
public ActionTest() {
model = new ModelTest();
}
@Action(value = "actionTest", results = {
@Result(name = SUCCESS, location = "/jsp/win.jsp"),
@Result(name = ERROR, location = "/jsp/loose.jsp"),
})
public String executeAction1() throws Exception {
System.out.println("pass: "+getModel().getPass()); //the field is always null
if ("test".equals(getModel().getPass()))
return SUCCESS;
return ERROR;
}
@Override
public ModelTest getModel() {
return model;
}
@Override
public void validate() {
String field;
if (parameters.get("pass") != null) {
field = parameters.get("pass")[0];
if (field == null || field.isEmpty())
addFieldError("pass", "the field is not set");
else if (!"test".equals(field))
addFieldError("pass", "the password is \"test\"");
}
}
@Override
public void setParameters(Map<String, String[]> arg0) {
this.parameters = arg0;
}
}
El Modelo
public class ModelTest {
private String pass;
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
}
La Forma
<s:form action="actionTest" theme="xhtml">
<s:textfield name="pass"/>
<sj:submit validate="true"/>
</s:form>
En este ejemplo: - Siempre estoy redirigidos a loose.jsp incluso si la contraseña es "prueba" - Si quiero imprimir una en otra JSP redirigida por esta acción, no vi nada (incluso si establezco un valor predeterminado en el modelo).
¿Puedes darme una mano por favor?
PD: Lo siento por mi mala Inglés:/
¿Qué sucederá si se quita la interfaz ParameterAware? Se puede saber por qué se utiliza este interceptor? Estoy utilizando el mismo caso de uso que se describen e cada cosa funciona bien? Puede validar su acción a través de @valid también. Funciona bien con las propiedades del modelo. –
El problema puede estar relacionado con esto: http://stackoverflow.com/a/21021131/1654265 –