dil*_*ent 10 spring spring-mvc spring-data spring-data-jpa spring-boot
我的模型是这样的:
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name="email")
private String email;
@Column(name = "weblink")
private String webLink;
//getter & setter
}
Run Code Online (Sandbox Code Playgroud)我们通过http请求收集表单或移动数据,springmvc会将这些数据发送给像用户这样的模型.
例如,我有这样的请求:
http://localhost:8080/update?id=1919&email=xx@google.com
在控制器中,请求URL及其参数将自动转换为User对象.
@RequestMapping(method = RequestMethod.GET, value = "/update0")
public User update(@ModelAttribute("User") User user){
System.out.println(user.getId());
System.out.println(user.getEmail());
System.out.println(user.getWebLink());
return userRepository.save(test);
}
Run Code Online (Sandbox Code Playgroud)如果我在mysql中有一个id为1919的记录,并且列(id,email,weblik)都有值.
如您所见,通过Web或移动设备传递的用户对象具有两个属性
http://localhost:8080/update?id=1919&email=xx@google.com
id和电子邮件有值,而weblink没有.
因此,如果我执行save方法,列电子邮件将更新为xx@google.com,weblik字段也将更新为NULL,但我不想更新此字段,我只想更新电子邮件字段.
我有两种方法来解决这个问题,但所有这些方法都不优雅.
5.1首先加载用户对象并更新
User userExist = userRepository.findOne(user.getId());
userExist.setEmail(user.getEmail());
//or using
//BeanUtil.copyProprty(formDto,modle)
userRepository.save();
Run Code Online (Sandbox Code Playgroud)
5.2使用@DynamicUpdate,但不起作用.
是否有其他方法来更新用户模型,不做一些额外的工作.
提前致谢.
Oli*_*ohm 13
最简单的方法是适当设置控制器方法:
@RequestMapping(value = "/users/{user}", method = RequestMethod.PATCH)
public … updateUser(@ModelAttribute User user) { … }
Run Code Online (Sandbox Code Playgroud)
根据参考文档,当调用此方法时,会发生以下步骤:
User需要获得的一个例子.这基本上需要向Spring MVC注册Converterfrom String以User将从URI模板中提取的路径段转换为User.如果您正在使用Spring Data并按照其参考文档中的说明启用其Web支持,则此功能将开箱即用.GETHTTP方法用作更新.GET被定义为安全操作(没有副作用),更新不是.PATCH这是正确的方法,因为它被定义为允许对现有资源进行部分更新.PUT和PATCH请求,你需要注册一个HttpPutFormContentFilter描述与应用在这里.我在Spring Boot中提出了一个问题,默认注册.