当前位置: 首页 > 知识库问答 >
问题:

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

鲜于喜
2023-03-14

我通过剖析示例应用程序来自学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模式时,触发了此错误消息。我已经查看了这个页面和这个帖子,但解释似乎不清楚。

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

编辑:
基于Biju Kun的回应,我将语法更改为以下内容:

@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个答案

刘选
2023-03-14

如果您有一个类型为< code>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, ...)
朱鹤轩
2023-03-14

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

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

BindingResult 是一个结果对象,其中包含在验证@ModelAttribute@Valid@RequestBody@RequestPart时可能出现的错误,因此您只能将其与这样批注的参数一起使用。每个注释都有 HandlerMethodArgumentResolver

EDIT(评论回复)

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

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

并且您可以将您的请求(取决于您的配置)设置为

localhost:8080/yourcontext/catowners?type=1

这里也没有什么要验证的,所以您不需要或不需要BindingResault。如果您尝试添加它,它会失败。

 类似资料:
  • 我正在学习Spring MVC,并试图验证表单。当用户搜索空白字符串时,将显示错误。当我执行我的代码时,我得到以下错误 Errors/BindingResult参数应该紧随控制器方法签名中的模型属性参数之后:public java.lang.string com.mycompany.controller.catalog.searchController.search(javax.servlet.h

  • 问题是,即使在为Exception.class声明回滚之后,事务仍然没有回滚。 1.我的数据源

  • 属性参数用来给已定义的属性附加元数据,类似于脚本语言的 Decorator 或者 C# 的 Attribute。 属性检查器相关参数 参数名 说明 类型 默认值 备注 type 限定属性的数据类型 (Any) undefined 详见 type 参数 visible 在 属性检视器 面板中显示或隐藏 boolean (注1) 详见 visible 参数 displayName 在 属性检视器 面板

  • 属性参数用来给已定义的属性附加元数据,类似于脚本语言的 Decorator 或者 C# 的 Attribute。 属性检查器相关参数 参数名 说明 类型 默认值 备注 type 限定属性的数据类型 (Any) undefined 详见 type 参数 visible 在 属性检视器 面板中显示或隐藏 boolean (注1) 详见 visible 参数 displayName 在 属性检视器 面板

  • 金属模式:金属参数 当使用 金属工作流程(相对于镜面工作流程)时,表面的发射率和光照通过金属度和平滑度修改。 当使用这种流程时,仍然会生成镜面反射,但是看起来是否真实,取决于设置的金属度和平滑度,而不是一个明确定义的开关。 金属模式不仅仅适用于看起来有金属质感的材质!这种模式之所以为称为金属模式,是因为你可以通过它控制物体表面的金属或非金属程度(译注:是否是金属或非金属,以及程度)。 金属参数 材

  • 由于 Vue 不允许动态添加根级响应式属性,所以你必须在初始化实例前声明根级响应式属性,哪怕只是一个空值: var vm = new Vue({ data: { // 声明 message 为一个空值字符串 message: '' }, template: '<div>{{ message }}</div>' }) // 之后设置 `message` vm.messa