我想对资源执行部分更新。我有一个想法,我可以结合@ModelAttribute(加载现有资源)和@RequestBody 来使用提供的字段填充它,然后运行@Valid。据我了解,@ModelAttribute 在其他任何事情之前都会被调用。
我的控制器调用 ModelAttribut 并使用我的 ContentPatternConverter 正确创建 ContentPattern 实体。虽然完成后我想用@RequestBody提供的字段填充“模式”,最后检查它是否有效。虽然我的 ContentPattern 在通过 ModelAttribute 创建后没有填充 RequestBody。
@RequestMapping(value = "/patterns/{id}", method = RequestMethod.PUT, produces = "application/json")
@ResponseBody
public ResponseEntity<ContentPattern> updateContentPattern(Principal principal, @ModelAttribute("id") @RequestBody ContentPattern pattern) { //implementation }
任何想法如何使用我的方法解决这个问题,或者是否有另一个(更好的)解决方案?
更新 1
经过更多研究后,我想出了以下解决方案。
- 创建了我自己的注释@RequestBodyPathVariable
- 编写了实现 HandlerMethodArgumentResolver 的 RequestBodyPathVariableMethodArgumentResolver。它的作用是 1) 基于 URI 路径变量(例如 patterns/{id})从自定义转换器获取现有资源。2) 从请求正文创建一个对象。3) 合并现有资源和提供的资源。4) 验证最终对象。5) 返回最终对象
源代码见要点:https ://gist.github.com/2687913
(其他情况可能需要更好的/其他合并方法。)
有用的链接: http ://blog.42.nl/articles/leveraging-the-spring-mvc-3.1-handlermethodargumentresolver-interface http://stackoverflow.com/questions/6591665/merging-two-objects-in-java