期望在模型属性@RequestBody或@RequestPart参数之后立即声明Errors / BindingResult参数

时间:2013-09-05 21:18:01

标签: java spring hibernate spring-mvc

我通过剖析示例应用程序然后在此处添加代码来测试我在解剖过程中开发的理论,从而自学Spring。我在测试一些我添加到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  

错误消息引用的方法是:

@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";
}  

当我尝试在Web浏览器中加载/ catowners url模式时,会触发此错误消息。我查看了this pagethis posting,但解释似乎并不清楚。

任何人都可以告诉我如何修复此错误,并解释它的含义吗?

编辑:
根据Biju Kunjummen的回复,我将语法改为:

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

我仍然收到相同的错误消息。是不是我不理解的东西?

第二次编辑:

根据Sotirios的评论,我将代码更改为以下内容:

@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";
 }

在告知eclipse运行后,我仍然收到相同的错误消息...再次在服务器上运行。

有什么我不理解的东西吗?

2 个答案:

答案 0 :(得分:18)

Spring使用一个名为HandlerMethodArgumentResolver的接口来解析处理程序方法中的参数,并构造一个作为参数传递的对象。

如果找不到,则传递null(我必须验证这一点)。

BindingResult是一个结果对象,其中包含可能验证@ModelAttribute@Valid@RequestBody@RequestPart的错误,因此您可以仅将其与带注释的参数一起使用。每个注释都有HandlerMethodArgumentResolver

编辑(回复评论)

您的示例似乎表明用户应提供宠物类型(作为整数)。我会把方法改为

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

您可以将您的请求(取决于您的配置)作为

localhost:8080/yourcontext/catowners?type=1

此处也无需验证,因此您不需要或不需要BindingResult。如果你试图添加它会失败。

答案 1 :(得分:5)

如果你有一个BindingResult类型的参数,那么在将http请求参数绑定到直接在BindingResult方法参数之前声明的变量时,它实质上是存在任何错误。

所以这些都是可以接受的:

@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, ...)