que - spring mvc download
¿Por qué mi validador de Spring 3 valida todo en el modelo? (1)
Supongo que este comportamiento no está cubierto en la documentación.
El problema es causado por lo siguiente:
De forma predeterminada, se llama a
@InitBinder
-un método anotado para cada atributo de modelo no primitivo, entrante y saliente (el propósito de llamarlo para los atributos entrantes es permitirle registrarPropertyEditor
s personalizado, que son utilizados por las etiquetas de formulario cuando se renderiza formar).DataBinder.setValidator()
contiene una comprobación defensiva que llama aValidator.supports()
y arroja una excepción si se devuelvefalse
. Por lo tanto, no hay ningún intento de realizar una validación, solo un control anticipado.
La solución es restringir el alcance de @InitBinder
a un atributo particular:
@InitBinder("whaleFormData")
protected void initBinder(WebDataBinder binder) { ... }
Tengo un controlador de resorte 3 con un validador para uno de los métodos. Insiste en validar cada objeto en el modelo. ¿Alguien podría explicarme por qué hace esto o si estoy haciendo algo mal?
De acuerdo con los documentos, 5.7.4.3 Configuración de un Validador JSR-303 para ser utilizado por Spring MVC ( http://static.springsource.org/spring/docs/3.0.0.RC3/spring-framework-reference/html/ch05s07.html )
Con JSR-303, una única instancia javax.validation.Validator normalmente valida todos los objetos modelo que declaran restricciones de validación. Para configurar un Validador respaldado por JSR-303 con Spring MVC, simplemente agregue un Proveedor JSR-303, como Hibernate Validator, a su classpath. Spring MVC lo detectará y habilitará automáticamente el soporte JSR-303 en todos los Controladores.
Ejemplo:
@Controller
public class WhaleController {
@Autowired
private Validator myValidator;
@Autowired
private WhaleService whaleService;
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.setValidator(this.myValidator);
}
@RequestMapping(value="/save-the-whales")
@Transactional
public void saveTheWhales(@Valid WhaleFormData formData, BindingResult errors, Model model) {
if (!errors.hasFieldErrors()) {
Whale whale = new Whale();
whale.setBreed( formData.getBreed() );
this.whaleService.saveWhale( whale );
model.addAttribute("whale", whale);
}
model.addAttribute("errors", errors.getFieldErrors());
}
}
Cuando se ejecute, se quejará de que Whale es un objetivo no válido para myValidator (que está configurado para validar WhaleFormData, y lo hace muy bien). Whale es un POJO sin restricciones de validación, anotación y ninguna configuración en ninguna parte. A través del método de prueba y error, he encontrado que CUALQUIER objeto colocado en el modelo intentará ser validado y fallará si el validador no está configurado para manejarlo. Los primitivos están bien.
¿Alguien puede decirme por qué es así, señalarme la documentación adecuada y / o decirme la mejor manera de poner algo en el modelo sin tener que validarlo?
En el caso anterior, me gustaría colocar "ballena" en el modelo ya que ahora tendrá un único whaleId () que recibió de mi capa de persistencia.
¡Gracias!