Java SpringREST控制器部分更新现有资源

Java SpringREST控制器部分更新现有资源,java,spring,rest,Java,Spring,Rest,我想对资源执行部分更新。我有一个想法,可以将@modeldattribute与@RequestBody组合起来加载现有资源,并使用提供的字段填充它,然后运行@Valid。据我所知,@modeldattribute是在调用其他任何东西之前被调用的 我的控制器调用ModelAttribute并使用我的ContentPatternConverter正确创建ContentPattern实体。尽管完成之后,我想用@RequestBody提供的字段填充该模式,最后检查它是否有效。尽管我的ContentPat

我想对资源执行部分更新。我有一个想法,可以将@modeldattribute与@RequestBody组合起来加载现有资源,并使用提供的字段填充它,然后运行@Valid。据我所知,@modeldattribute是在调用其他任何东西之前被调用的

我的控制器调用ModelAttribute并使用我的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。它所做的是基于URI路径变量的1,例如patterns/{id}从自定义转换器获取现有资源。2从请求主体创建一个对象。3合并现有资源和提供的资源。4验证最终对象。5返回最终对象 源代码见要点:

对于其他情况,可能需要更好的/其他合并方法

有用链接:
http://stackoverflow.com/questions/6591665/merging-two-objects-in-java

我在考虑这个问题,下面是我要做的事情免责声明,我没有尝试过这个:

首先,仅当您希望将该对象传递给视图时,才会使用

允许Spring解析您的输入体(假设它是Json)并构建ContentPattern对象。但您希望从存储库中获取该对象,然后更新相关字段

首先,我将创建的实现。使用检查它是否来自类ContentPattern。此实现将作为依赖项注入接收,这是用于创建ContentPattern对象的

然后从创建一个,如下所示:

return new ServletServerHttpRequest((HttpServletRequest)nativeWebRequest.getNativeRequest());
然后使用转换器创建ContentPattern对象。此对象将填充一些字段、要更新的字段以及其标识符

使用由Spring注入类的标识符、存储库或持久性上下文,可以从存储库中获取对象

现在您有了两个ContentPattern对象,一个从存储库获得,另一个从请求主体创建

使用对象的setter,使用另一个对象的字段更新存储库中的对象,然后使用Spring注入到这个类中的

如果一切正常,可以选择将更新的对象保存到persistence,并将其用作方法的返回值


我希望这足够清楚

谢谢你的建议。我最终使用了相同的概念,但实现了HandlerMethodArgumentResolver。