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
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.
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
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.
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í
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:
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 }
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"; } }
Disculpe, no funciona, tal vez el uso del interceptor Spring MVC es una buena solución – monkeyk
- 1. Spring 3 MVC: Mostrar mensaje de validación con validador personalizado
- 2. primavera @MVC y @RequestParam validación
- 3. Spring MVC y JSR 303
- 4. ASP.NET MVC vs Spring MVC
- 5. validación de imágenes en MVC
- 6. ¿Cuándo tiene sentido usar Spring WebFlow sobre Spring MVC?
- 7. anotación @RequestMapping en Spring MVC
- 8. Múltiple @PathVariable en Spring MVC
- 9. Desventajas del uso de Stripes + Spring vs Spring MVC
- 10. Buenos patrones para pruebas unitarias de beans que tienen validación basada en anotaciones en Spring MVC
- 11. spring mvc vs seam
- 12. Spring MVC JavaScript
- 13. ServletContext y Spring MVC
- 14. Interceptor mvc Spring addObject
- 15. AJAX con Spring MVC
- 16. Remitir dentro Spring MVC
- 17. @JsonView con Spring MVC
- 18. Spring MVC Plugin Architecture
- 19. Freemarker + Spring MVC tutorial
- 20. Spring MVC o Wicket?
- 21. Spring MVC vinculante
- 22. Spring MVC Annotations
- 23. Testing Spring @MVC anotaciones
- 24. jQuery y Spring MVC
- 25. Spring MVC, hacia adelante
- 26. Spring MVC: desactivar DefaultAnnotationHandlerMapping
- 27. ¿Cómo obtengo Spring MVC para invocar la validación en una prueba JUnit?
- 28. Spring 3.0 MVC MVC: etiqueta vista-controlador
- 29. Validación MVC DateTime que falla
- 30. Spring getBean con validación de tipo
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
@Saram: Recomiendo usar JSR 303 en lugar de validadores de primavera. - De todas formas publica una nueva pregunta si quieres preguntar algo. – Ralph
Puede usar 'binder.addValidator (new FooValidator());' para combinar ambos enfoques de validación. – shadowhorst