【问题标题】:customize Spring MVC requestBody mapping based on HTTP method?基于 HTTP 方法自定义 Spring MVC requestBody 映射?
【发布时间】:2017-08-12 09:52:41
【问题描述】:

我的 Java 8,Spring boot 1.4 应用程序有一个控制器方法使用 application/json (jackson 2.6.5) 作为

public MyModel updateModel(@Valid @RequestBody( required = true) MyModel myModel) {
....
}

在 MyModel 中,我有一个字段,我想在 HTTP 方法 = POST 时自动生成值,当 HTTP 方法 = PUT 时直接使用请求值。可行吗?

希望我解释清楚。任何帮助都深表感谢

【问题讨论】:

  • 非常感谢 cmets 的所有帮助。非常感谢。我已经从我的 DTO 中删除了只读 jackson 注释,并将该字段的数据自动生成逻辑移至服务,我认为这在概念上也更有意义

标签: java spring spring-mvc spring-boot jackson


【解决方案1】:

添加HttpServletRequest参数并调用getMethod()

有关受支持的方法参数类型,请参阅 Spring documentation。或者阅读@RequestMapping的javadoc

您还应该指定您希望控制器方法处理的 HTTP 方法,例如@RequestMapping(method={RequestMethod.POST, RequestMethod.PUT})

【讨论】:

  • 哦。我知道了。我可以用 2 个控制器方法来做吗? 1 用于 POST,1 用于 PUT。这对我来说看起来更清楚。尽管如此,我怎样才能将方法传递给 MyModel 中该字段的设置器,这只是一个带有杰克逊注释的 POJO
  • 你不能。这是你必须在控制器方法中做的事情。
  • 但是当我的控制器获取 MyModel 时,它已经被映射了。我将无法知道该字段是自动创建的还是由有效负载设置的
  • 不知道你的问题是什么。如果方法是 PUT,则数据对象的特定字段是从请求中分配的。如果方法是 POST,则该字段未分配,并且您的控制器代码可以在对对象执行任何请求的操作(创建/更新/...)之前进行自动分配。
  • 在POST(创建)的情况下,我需要忽略这个字段的输入,取一个自动生成的值;但是使用 PUT,我需要将请求中此字段的值(如果存在)与路径变量进行比较
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-22
  • 2016-01-22
  • 2019-10-14
  • 1970-01-01
  • 2013-07-13
  • 2020-05-29
  • 2015-10-13
相关资源
最近更新 更多