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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/18646121/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-12 09:48:55  来源:igfitidea点击:

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

javaspringhibernatespring-mvc

提问by CodeMed

I am teaching myself Spring by dissecting example applications and then adding code here and there to test theories that I develop during the dissection. I am getting the following error message when testing some code that I added to a Spring application:

我通过剖析示例应用程序来自学 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  

The method to which the error message refers is:

错误信息所指的方法是:

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

This error message was triggered when I tried to load the /catowners url pattern in the web browser. I have reviewed this pageand this posting, but the explanation does not seem clear.

当我尝试在 Web 浏览器中加载 /catowners url 模式时触发了此错误消息。我已经查看了这个页面这个帖子,但解释似乎不清楚。

Can anyone show me how to fix this error, and also explain what it means?

谁能告诉我如何解决这个错误,并解释它的含义?

EDIT:
Based on Biju Kunjummen's response, I changed the syntax to the following:

编辑:
根据 Biju Kunjummen 的回应,我将语法更改为以下内容:

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

I am still getting the same error message. Is ther something I am not understanding?

我仍然收到相同的错误消息。有什么我不明白的吗?

SECOND EDIT:

第二次编辑:

Based on Sotirios's comment, I changed the code to the following:

根据 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";
 }

I am still getting the same error message after telling eclipse to run as...run on server again.

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

Is there something that I am not understanding?

有什么我不明白的吗?

采纳答案by Sotirios Delimanolis

Spring uses an interface called HandlerMethodArgumentResolverto resolve the parameter in your handler methods and construct an object to pass as an argument.

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

If it doesn't find one, it passes null(I have to verify this).

如果没有找到,则通过null(我必须验证这一点)。

The BindingResultis a result object that holds errors that may have come up validating a @ModelAttribute, @Valid, @RequestBodyor @RequestPart, so you can only use it with parameters that are annotated as such. There are HandlerMethodArgumentResolverfor each of those annotations.

BindingResult是保存可能已经拿出了一个验证错误,结果对象@ModelAttribute@Valid@RequestBody或者@RequestPart,这样你就可以只与这样的注释参数使用它。HandlerMethodArgumentResolver这些注释中的每一个都有。

EDIT (response to comment)

编辑(对评论的回应)

Your example seems to show that the user should provide a pet type (as an integer). I would change the method to

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

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

And you would make your request (depending on your config) as

你会提出你的请求(取决于你的配置)

localhost:8080/yourcontext/catowners?type=1

Here too there is nothing to validate so you don't want or need a BindingResult. It would fail if you tried to add it anyway.

这里也没有什么需要验证的,所以你不需要或不需要BindingResult. 如果您无论如何都尝试添加它,它将失败。

回答by Biju Kunjummen

If you have a parameter of type BindingResultit is essentially to hold any errors when binding http request parameters to a variable declared directly preceding the BindingResult method parameter.

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

So all of these is acceptable:

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

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