2012-09-24 20 views
7

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

+0

¿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. –

+0

El problema puede estar relacionado con esto: http://stackoverflow.com/a/21021131/1654265 –

Respuesta

0

interceptor En realidad el modelo impulsado viene con el defaultStack

<interceptor-stack name="defaultStack"> 
       <interceptor-ref name="exception"/> 
       <interceptor-ref name="alias"/> 
       <interceptor-ref name="servletConfig"/> 
       <interceptor-ref name="prepare"/> 
       <interceptor-ref name="i18n"/> 
       <interceptor-ref name="chain"/> 
       <interceptor-ref name="debugging"/> 
       <interceptor-ref name="profiling"/> 
       <interceptor-ref name="scopedModelDriven"/> 
       <interceptor-ref name="modelDriven"/> 
       <interceptor-ref name="fileUpload"/> 
       <interceptor-ref name="checkbox"/> 
       <interceptor-ref name="staticParams"/> 
       <interceptor-ref name="params"> 
        <param name="excludeParams">dojo\..*</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> 

y la jsonValidationWorkflowStack no por culpa sólo incluye basicStack

<interceptor-stack name="jsonValidationWorkflowStack"> 
       <interceptor-ref name="basicStack"/> 
       <interceptor-ref name="validation"> 
        <param name="excludeMethods">input,back,cancel</param> 
       </interceptor-ref> 
       <interceptor-ref name="jsonValidation"/> 
       <interceptor-ref name="workflow"/> 
</interceptor-stack> 

este es el basicStack

<interceptor-stack name="basicStack"> 
       <interceptor-ref name="exception"/> 
       <interceptor-ref name="servletConfig"/> 
       <interceptor-ref name="prepare"/> 
       <interceptor-ref name="checkbox"/> 
       <interceptor-ref name="multiselect"/> 
       <interceptor-ref name="actionMappingParams"/> 
       <interceptor-ref name="params"> 
        <param name="excludeParams">dojo\..*,^struts\..*</param> 
       </interceptor-ref> 
       <interceptor-ref name="conversionError"/> 
</interceptor-stack> 

intento de añadir

@Namespace("/actions") 
    @ParentPackage("actions") 
    @InterceptorRefs({ 
     @InterceptorRef("jsonValidationWorkflowStack"), 
     @InterceptorRef("defaultStack") 
})