【问题标题】:Spring MVC @ModelAttribute is not compatible to RESTSpring MVC @ModelAttribute 与 REST 不兼容
【发布时间】:2013-03-01 15:40:38
【问题描述】:

我正在使用 RESTful 请求开发一个新的 Spring MVC 应用程序。该应用程序执行标准数据库加载对象、绑定值和保存。为了不丢失表单上不可用的对象值,我使用@ModelAttribute 方法在绑定之前预加载对象。

使用 URL 加载代理时

/agency/418

我的@ModelAttribute 方法现在可以学习“418”ID。我的理解是只能处理常规请求属性,所以我的 URL 需要是

/agency/418?id=418

这有点打破了 RESTful 模式。发布数据时也是如此。

有人可以评论这个观察吗...我错过了什么吗?

谢谢 西蒙

【问题讨论】:

  • 我的评论是您正在尝试将 ModelAttribute 函数用于它不应该做的事情。它并不是为了预先填充对象以在 RESTful 服务调用中使用,而是为了简化表单数据和控制器之间的绑定。该数据将是 POST 或 GET,从这个意义上说,您是正确的,您必须传递值才能执行您正在尝试的操作,但我认为您的里程会有所不同。
  • stackoverflow.com/questions/3672100/… 建议使用表单对象进行绑定...我会研究一下。
  • 有两个地方可以放ModelAttribute注解。第一个是视图处理程序方法的参数。在这种情况下,用途是提供表单和处理程序之间的绑定。第二种是将其放在不带参数并返回目标 ModelAttribute 的新实例的方法上。这通常是一种私有方法。这样做的目的是在处理程序定义不在模型或 HttpSession 中的 ModelAttribute 时创建默认版本。然后调用此方法来创建一个空的、已初始化的实例以供视图处理程序方法使用。
  • 如果您想处理 RESTful 请求,其中值作为 URL 的一部分传递,我建议查看 PathVariable 注释,它允许您将处理程序的参数绑定到部件传入的 URL 模式。 @Martin Frey 下面有一个很好的例子。

标签: rest spring-mvc


【解决方案1】:

您可以很好地使用路径变量来初始化模型属性:

@controller
public controller {
   @modelattribute("model")
   public Entity initentity(@pathvariable integer id) {
     return dao.getentity(id);
   }

   @requestmapping("/{id}")
   public String somerequest(@modelattribute("model") Entity entity) {
      ....
   }      
}

【讨论】:

  • 我相信jira.springsource.org/browse/SPR-5500 准确地涵盖了该主题。
  • 这是一个很好的指针。我们遇到了这个问题,并按照第二条评论中描述的方式通过分离控制器来解决它。从我的角度来看,它是一个干净的解决方案。
【解决方案2】:

我们放弃了在 Spring 2 中使用 @ModelAttribute 替换过去的“formBackingObject”的想法。相反,我们使用普通表单对象类进行表单绑定,然后将值复制到持久实体.表单对象可以由 Spring 即时创建,因此我们不再需要 @ModelAttribute 来加载数据库。该主题包含在Does Spring MVC require copy/paste of Entity to FormObject?。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    • 2013-04-19
    • 2014-09-20
    相关资源
    最近更新 更多