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

Spring:绑定带有和不带有@ModelAttribute的对象

甘永春
2023-03-14

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

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

这很好,但这里的问题是,在我的欢迎中,我不需要这个用户对象。jsp页面,那么为什么要使模型对象更重呢。因此,我尝试了不使用ModelAttribute,这也适用于我,如下所示。

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

所以我只想知道什么是专业

我想将我的查询分类为以下4种类型的request.what如果我不需要在视图中发送数据并且我的请求是任何-

  1. 查询字符串即GET中的表单数据
  2. 在POST中请求有效载荷或body ie表单数据
  3. json数据在ajaxated GET requst
  4. POST请求中的json数据-我想这不会绑定在两者中的任何一个中。@Request estBody是必需的。

共有3个答案

有骏祥
2023-03-14

除了向Model添加对象之外,Spring MVC还使用它将绑定的对象提供给Controller方法,您可以在其中使用它,在您的情况下是“注册”。

是的,在Spring MVC中,@modelatAttribute是将传入的post数据绑定到对象的最安全、最好的方法。

拓拔俊艾
2023-03-14

这个问题很有用,但我看这里的回答不能正确回答这个问题。

我通读了stackoverflow中的更多线程,发现这个非常有用:https://stackoverflow.com/a/26916920/1542363

对于我自己来说,如果我只需要绑定,不想在模型中存储参数对象,那么就不要使用ModelAttribute。

田博超
2023-03-14

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

两者都将请求参数绑定到用户,并将生成的对象作为属性添加到模型中-该属性名称来自方法参数的无头类型名称,即用户。

@modeldattribute可用于自定义属性的名称,例如@modeldattribute(“用户”),或向代码读者提示此参数在视图中使用。但正如您所说,这两种方法都不适用于您的用例。

无论是否使用ModelAttribute注释,Spring中完全相同的代码将用于填充参数-所讨论的代码是org。springframework。网状物servlet。mvc。方法注释。ServletModelAttributeMethodProcessor。

因此,对我来说,在代码中使用公共字符串寄存器(User User,BindingResult)签名更有意义。向模型中不需要的方法参数添加注释可能会让阅读代码的人感到困惑。

稍长一点的答案是,在您的案例中,可能有一个指定modeldattribute的理由,但这相当神秘,不太可能。

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

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

resolvers.add(new ServletModelAttributeMethodProcessor(false));

...

resolvers.add(new ServletModelAttributeMethodProcessor(true));

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

 类似资料:
  • 问题内容: 我正在使用Spring MVC处理JSON POST请求。在幕后,我使用的是在Jackson JSON处理器上构建的MappingJacksonHttpMessageConverter,并在使用mvc:annotation驱动时启用了该功能。 我的一项服务收到了一系列操作: 我发现杰克逊将requestBody映射到java.util.LinkedHashMap项列表(简单数据绑定)。

  • 我正在尝试将vaadin与spring(没有Spring Boot)和基于java注释的spring部分配置结合起来。 自动连接似乎适用于vaadin ui部分,但不适用于“自定义ui类”(例如,“公共类LoginScreen扩展自定义组件”)。我在SysOut上得到一个NPE或一个空对象。 此外,我注意到“@ComponentScan(base Packages={"net.myapp"})”没

  • 所以我试图用th: href重定向整个网址,但它添加了我不想要的字符。 我现在的网址是这个 我试图回到帖子的一部分,那就是 所以现在这就是我的html的样子 这是我得到的网址 Id是正确的,但我不确定为什么

  • 我想绑定JavaFX与值。 我试过了,例如。 或 但我总是得到NullPointerException。 我怎么才能修好它?

  • 问题内容: 我注意到,如果使用许多不带括号的DataFrame函数,其行为似乎类似于“属性”,例如 这是如何完成的,是一种好的做法?这是Linux上的熊猫0.15.1 问题答案: 它们是不同的,因此不建议使用,它们清楚地表明这是一种方法并且恰好输出结果,而另一种则表明了预期的输出。 这就是为什么您不应该这样做的原因: 所以好吧,您没有使用括号正确地调用该方法并看到显示为有效的输出,但是如果您引用了

  • 我对Spring保安很陌生。我试图在我的应用程序中实现来执行。我学习了示例代码,并且能够生成。但是根据示例文件中的配置,我可以使用配置中的内存数据集来验证中的输入。但是,我不理解如何将中发送的和与我的中的值进行检查。请引导我。我的配置类是 在重写的中,我可以设置将与路径的中存在的凭据进行比较的凭据