websystique mvc example java spring hibernate spring-mvc

java - mvc - Se espera que se declare un argumento Errors/BindingResult inmediatamente después del atributo model, los argumentos @RequestBody o @RequestPart



spring mvc+hibernate+maven crud operations example (2)

Me estoy enseñando a mí mismo a Spring por diseccionar aplicaciones de ejemplo y luego agregar código aquí y allá para probar las teorías que desarrollé durante la disección. Recibo el siguiente mensaje de error al probar un código que agregué a una aplicación Spring:

An Errors/BindingResult argument is expected to be declared immediately after the model attribute, the @RequestBody or the @RequestPart arguments to which they apply

El método al que se refiere el mensaje de error es:

@RequestMapping(value = "/catowners", method = RequestMethod.GET) public String findOwnersOfPetType(Integer typeID, BindingResult result, Map<String, Object> model) { // find owners of a specific type of pet typeID = 1;//this is just a placeholder Collection<Owner> results = this.clinicService.findOwnerByPetType(typeID); model.put("selections", results); return "owners/catowners"; }

Este mensaje de error se activó cuando intenté cargar el patrón de url / catowners en el navegador web. He revisado esta página y esta publicación , pero la explicación no parece clara.

¿Alguien me puede mostrar cómo corregir este error y también explicar qué significa?

EDITAR:
Basándome en la respuesta de Biju Kunjummen, cambié la sintaxis a lo siguiente:

@RequestMapping(value = "/catowners", method = RequestMethod.GET) public String findOwnersOfPetType(@Valid Integer typeID, BindingResult result, Map<String, Object> model)

Todavía recibo el mismo mensaje de error. ¿Hay algo que no estoy entendiendo?

SEGUNDA EDICIÓN:

Basado en el comentario de Sotirios, cambié el código a lo siguiente:

@RequestMapping(value = "/catowners", method = RequestMethod.GET) public String findOwnersOfPetType(BindingResult result, Map<String, Object> model) { // find owners of a specific type of pet Integer typeID = 1;//this is just a placeholder Collection<Owner> results = this.clinicService.findOwnerByPetType(typeID); model.put("selections", results); return "owners/catowners"; }

Sigo recibiendo el mismo mensaje de error después de decirle a eclipse que se ejecute como ... ejecutar nuevamente en el servidor.

¿Hay algo que no estoy entendiendo?


Si tiene un parámetro de tipo BindingResult , es esencialmente contener cualquier error al vincular los parámetros de solicitud http a una variable declarada directamente antes del parámetro del método BindingResult.

Así que todo esto es aceptable:

@RequestMapping(value = "/catowners", method = RequestMethod.GET) public String findOwnersOfPetType(@Valid MyType type, BindingResult result, ...) @RequestMapping(value = "/catowners", method = RequestMethod.GET) public String findOwnersOfPetType(@ModelAttribute MyType type, BindingResult result, ...) @RequestMapping(value = "/catowners", method = RequestMethod.GET) public String findOwnersOfPetType(@RequestBody @Valid MyType type, BindingResult result, ...)


Spring usa una interfaz llamada HandlerMethodArgumentResolver para resolver el parámetro en sus métodos de manejo y construir un objeto para pasarlo como un argumento.

Si no encuentra uno, pasa null (tengo que verificar esto).

BindingResult es un objeto de resultado que contiene errores que pueden haber surgido al validar un @ModelAttribute , @Valid , @RequestBody o @RequestPart , por lo que solo puede usarlo con parámetros anotados como tales. Hay HandlerMethodArgumentResolver para cada una de esas anotaciones.

EDITAR (respuesta al comentario)

Su ejemplo parece mostrar que el usuario debe proporcionar un tipo de mascota (como un entero). Yo cambiaria el metodo a

@RequestMapping(value = "/catowners", method = RequestMethod.GET) public String findOwnersOfPetType(@RequestParam("type") Integer typeID, Map<String, Object> model)

Y usted haría su solicitud (dependiendo de su configuración) como

localhost:8080/yourcontext/catowners?type=1

Aquí tampoco hay nada que validar, por lo que no desea ni necesita un BindingResult . Fallaría si intentaras agregarlo de todos modos.