2011-04-07 28 views
5

cómo obtener el objeto de solicitud en la clase de validador, ya que necesito validar los contenidos, es decir, los parámetros presentes en el objeto de solicitud.Validación en Spring MVC

Respuesta

1

No es 100% seguro de que sigo bien su pregunta, pero con Spring MVC, se pasa el objeto en el método y anotar (al menos con Spring 3), así:

@RequestMethod(value = "/accounts/new", method = RequestMethod.POST) 
public String postAccount(@ModelAttribute @Valid Account account, BindingResult result) { 
    if (result.hasErrors()) { 
     return "accounts/accountForm"; 
    } 

    accountDao.save(account); 
} 

El la anotación relevante aquí es @Valid, que es parte de JSR-303. Incluya también el parámetro BindingResult para que pueda verificar si hay errores, como se ilustra arriba.

4

Usando un validador simple (su validador personalizado) No necesita el objeto de solicitud para obtener el parámetro en Validador. Puedes tenerlo directamente desde.

Por ejemplo: Esto comprobará campo de solicitud con el nombre name y age

public class PersonValidator implements Validator { 

    /** 
    * This Validator validates just Person instances 
    */ 
    public boolean supports(Class clazz) { 
     return Person.class.equals(clazz); 
    } 

    public void validate(Object obj, Errors e) { 
     ValidationUtils.rejectIfEmpty(e, "name", "name.empty"); 
     Person p = (Person) obj; 
     if (p.getAge() < 0) { 
      e.rejectValue("age", "negativevalue"); 
     } else if (p.getAge() > 110) { 
      e.rejectValue("age", "too.darn.old"); 
     } 
    } 
} 

Vea también

9

Usted tiene dos opciones:

  • JSR 303 (Bean Validation) validadores
  • primavera validadores

Para JSR 303 necesita Spring 3.0 y debe anotar la clase del modelo con JSR 303 anotaciones, y escribir un @ Válido delante de su parámetro en el método del controlador de controlador web. (como Willie Wheeler show in his answer). Adicionalmente debe habilitar esta funcionalidad en la configuración:

<!-- JSR-303 support will be detected on classpath and enabled automatically --> 
<mvc:annotation-driven/> 

Para primavera validadores, tiene que escribir su Validador (ver Jigar Joshi's answer) que implementa la interfaz org.springframework.validation.Validator. El debe registrar su Validator en el Controlador. En Spring 3.0 se puede hacer esto en un @InitBinder anotada método, mediante el uso de WebDataBinder.setValidator (setValidator es un método de la superclase DataBinder)

Example (from the spring docu) 
@Controller 
public class MyController { 

    @InitBinder 
    protected void initBinder(WebDataBinder binder) { 
     binder.setValidator(new FooValidator()); 
    } 

    @RequestMapping("/foo", method=RequestMethod.POST) 
    public void processFoo(@Valid Foo foo) { ... } 
} 

Para más detalles, echar un vistazo a la referencia de la primavera, Capítulo 5.7.4 Spring MVC 3 Validation .

BTW: en Spring 2 había algo como una propiedad setValidator en el SimpleFormController.

+0

Configuración validador de primavera esconde hibernación función de validación (JSR 303). ¿Hay alguna manera de mantener la validación de hibernación y además usar un propio validador de resorte? – Saram

+0

@Saram: Recomiendo usar JSR 303 en lugar de validadores de primavera. - De todas formas publica una nueva pregunta si quieres preguntar algo. – Ralph

+0

Puede usar 'binder.addValidator (new FooValidator());' para combinar ambos enfoques de validación. – shadowhorst

0

Puede agregar fácilmente otro método con el parámetro HttpServletRequest.

public void validateReq(Object target, Errors errors,HttpServletRequest request) { 

     // do your validation here 
} 

Tenga en cuenta que no se está sustituyendo un método que aquí

0

que también tienen el mismo problema cuando se utiliza la primavera de validación Validar código de imagen. En el implementador del validador, quiero obtener el captcha correcto de HttpSession (de HttpServletRequest get HttpSession).

No se encontraron buenos códigos para obtenerlo en el validador, ¡¡¡tan malo !!!

hay algunas propuesta de transacción de la siguiente manera:

  1. En la forma de unión DTO añadir un campo adicional (llamada: correctCaptcha), en el método controlador de establecer el valor del campo de HttpSession, entonces se puede validar en el validador

    public class UserRegisterDto { 
        private String correctCaptcha; 
        //getter,setter 
    } 
    
  2. Añadir la referencia HttpServletRequest en forma DTO vinculante, a continuación, se puede utilizar en el validador.

    public class UserRegisterDto { 
        private HttpServletRequest request; 
        //getter ,setter 
    } 
    
    @RequestMapping(value = "register.hb", method = RequestMethod.POST) 
    public String submitRegister(@ModelAttribute("formDto") @Valid UserRegisterDto formDto, HttpServletRequest request,BindingResult result) { 
        formDto.setRequest(request); 
        if (result.hasErrors()) { 
         return "user_register"; 
        } 
    } 
    
+0

Disculpe, no funciona, tal vez el uso del interceptor Spring MVC es una buena solución – monkeyk