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.