gpt4 book ai didi

Spring : binding object with and without @ModelAttribute

转载 作者:IT老高 更新时间:2023-10-28 13:57:41 35 4
gpt4 key购买 nike

我是 Spring 的新手,正在注册一个用户。我确实喜欢这个。

@RequestMapping("/register")
public String register(@ModelAttribute User user,BindingResult result){
if(!result.hasErrors()){
userSerive.register(user);
}
return "welcome";
}

这很好用,但这里的问题是我不需要这个 user我的 welcome.jsp 中的对象页面,为什么要让模型对象更重。所以我尝试不使用 @ModelAttribute ,这也适用于我,如下所示。

@RequestMapping("/register")
public String register(User user,BindingResult result){
if(!result.hasErrors()){
userSerive.register(user);
}
return "welcome";
}

所以我只想知道两者的优缺点和如果我真的不需要user,这是最好的做法。 jsp 中的对象.@ModelAttribute除了将对象添加到模型之外,还有其他任何事情,spring 隐式绑定(bind)没有。是 @ModelAttribute更安全的绑定(bind)方式还是其他方式?

我想将我的查询分类为以下 4 种类型的请求。使用和不使用 @ModelAttribute 会有什么区别如果我不需要在 View 中发送数据并且我的请求是任何一个-

  1. 查询字符串,即GET中的表单数据
  2. 请求负载或正文,即 POST 中的表单数据
  3. ajaxified GET 请求中的 json 数据
  4. POST 请求中的 json 数据——我猜这两者都不会绑定(bind)。 @RequestBody是必需的。

最佳答案

在您的情况下,两个方法签名之间的行为可能(见下文...)没有区别。

两者都将请求参数绑定(bind)到 user 并将生成的对象作为属性 user 添加到模型中 - 此属性名称派生自方法参数,User

@ModelAttribute 可用于自定义属性的名称,例如@ModelAttribute("theUser"),或者提示代码的读者在 View 中使用了这个参数。但正如您所说,这些都不适用于您的用例。

无论您是否使用 @ModelAttribute 注释,Spring 中完全相同的代码都将用于填充参数 - 有问题的代码是 org.springframework.web.servlet.mvc .method.annotation.ServletModelAttributeMethodProcessor.

因此,您在代码中使用 public String register(User user, BindingResult result) 签名对我来说更有意义。向模型中不需要的方法参数添加 @ModelAttribute 注释可能会使阅读您的代码的人感到困惑。


稍长一点的答案是,差不多可能是在您的情况下指定 @ModelAttribute 的原因 - 但它非常神秘且不太可能。

Spring 处理程序方法中的方法参数由 HandlerMethodArgumentResolver 实例填充。这些是可配置的,并为每个参数依次尝试。

默认处理程序方法参数解析器如下所示(参见RequestMappingHandlerAdapter):

resolvers.add(new ServletModelAttributeMethodProcessor(false));

...

resolvers.add(new ServletModelAttributeMethodProcessor(true));

如果您要在中间添加自己的,例如UserHandlerMethodArgumentResolver,然后您可以使用 @ModelAttribute 告诉 Spring 以默认方式处理特定参数,而不是使用您的自定义参数解析器类。

关于 Spring : binding object with and without @ModelAttribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42462450/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com