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