我们正在尝试在Spring 3.2中实现一个特殊的部分更新功能.我们使用Spring作为后端,并有一个简单的Javascript前端.我无法找到满足我们要求的直接解决方案,即update()函数应该采用任意数量的字段:值并相应地更新持久性模型.
我们对所有字段进行内联编辑,因此当用户编辑字段并确认时,id和修改后的字段将作为json传递给控制器.控制器应该能够从客户端(1到n)接收任意数量的字段并仅更新这些字段.
例如,当id == 1的用户编辑他的displayName时,发布到服务器的数据如下所示:
{"id":"1", "displayName":"jim"}
Run Code Online (Sandbox Code Playgroud)
目前,我们在UserController中有一个不完整的解决方案,如下所述:
@RequestMapping(value = "/{id}", method = RequestMethod.POST )
public @ResponseBody ResponseEntity<User> update(@RequestBody User updateUser) {
dbUser = userRepository.findOne(updateUser.getId());
customObjectMerger(updateUser, dbUser);
userRepository.saveAndFlush(updateUuser);
...
}
Run Code Online (Sandbox Code Playgroud)
这里的代码有效,但有一些问题:@RequestBody创建一个新的updateUser,填充id和displayName.CustomObjectMerger将其updateUser与dbUser数据库中的相应内容合并,更新其中包含的唯一字段updateUser.
问题是Spring updateUser使用默认值和其他自动生成的字段值填充了一些字段,这些字段值在合并时会覆盖我们所拥有的有效数据dbUser.明确声明它应该忽略这些字段不是一个选项,因为我们希望我们update也能够设置这些字段.
我正在寻找一些方法让Spring自动合并显式发送到update()函数中的信息dbUser(不重置默认/自动字段值).有没有简单的方法来做到这一点?
更新:我已经考虑过以下选项,它几乎可以满足我的要求,但并不完全.问题是它需要更新数据,@RequestParam而(AFAIK)不执行JSON字符串:
//load the existing user into the model for injecting into the update function
@ModelAttribute("user")
public …Run Code Online (Sandbox Code Playgroud) 我正在使用Spring 3.1为iPhone和Android应用程序创建Restful网站和Web服务.在我的应用程序中,我使用Spring Message Convertors(org.springframework.http.converter.json.MappingJacksonHttpMessageConverter)将JSON转换为Java对象,反之亦然.
我的目标是JSP页面,Iphone/Andois app应该只使用单个控制器方法(相同的URL).
我使用Spring表单标签进行从JSP到控制器的对象绑定,@ModelAttribute如下所示.
@RequestMapping(value = "reset-password", method = RequestMethod.POST)
public ModelAndView resetPassword(@ModelAttributeForgot forgotPassword,
HttpServletRequest request) {
System.out.println("data recived=="+forgotPassword.getNewPassword());
}
Run Code Online (Sandbox Code Playgroud)
但是,如果数据是从iPhone/Android应用程序发布的,那么同样的情况就不适用了,结果是:
recived = = null;
所以为了克服这个问题,我@RequestBody在地方使用了注释@ModelAttribute.
所以我的控制器如下所示:
@RequestMapping(value = "reset-password", method = RequestMethod.POST)
public ModelAndView resetPassword(@RequestBody Forgot forgotPassword,
HttpServletRequest request) {
System.out.println("data recived=="+forgotPassword.getNewPassword());
}
Run Code Online (Sandbox Code Playgroud)
它的工作原理,我得到的结果是:
收到的数据== somedata;
但是@RequestBody然后在JSP页面上不能使用spring表单,并且数据不会转换为对象而且我得到了null值.
@RequestBody注释以JSP形式的弹簧形式标签以JSON的形式发布数据吗?编辑:
在写String到位Bean类的,我能够获得纯文本格式的内容,如下图所示:
@RequestMapping(value = "reset-password", method = RequestMethod.POST)
public …Run Code Online (Sandbox Code Playgroud)