Spring Boot 上的基本放置(更新)

我想要一些非常基本的东西。


我只想更新用户。前端为用户发送一个json。 我想避免设置 currentUser 的每个值(它有 50 个字段)


@PutMapping("user/{id}")

public boolean updateUser(@PathVariable id, @RequestBody User user) {

   User currentUser = userRepo.findOne(id);

   // What now??


}


江户川乱折腾
浏览 172回答 3
3回答

交互式爱情

你需要做这样的事情。请记住,这种方法有助于部分对象更新。这意味着如果您的对象(在 RequestBody 中)不包含某些字段(field==null),那么该字段将保持不变。@PutMapping("user/{id}")public boolean updateUser(@PathVariable id, @RequestBody User user) {   User currentUser = userRepo.findOne(id);   user = (User) PersistenceUtils.partialUpdate(currentUser, user);   return userRepo.save(user);}public class PersistenceUtils {    public static Object partialUpdate(Object dbObject, Object partialUpdateObject){        String[] ignoredProperties = getNullPropertyNames(partialUpdateObject);        BeanUtils.copyProperties(partialUpdateObject, dbObject, ignoredProperties);        return dbObject;    }    private static String[] getNullPropertyNames(Object object) {        final BeanWrapper wrappedSource = new BeanWrapperImpl(object);        return Stream.of(wrappedSource.getPropertyDescriptors())                .map(FeatureDescriptor::getName)                .filter(propertyName -> wrappedSource.getPropertyValue(propertyName) == null)                .toArray(String[]::new);    }}

慕森王

你可以参考这个关于 PATCH vs PUT 的问题。假设您只是在更改用户的在线状态。在这种情况下,最好使用 PATCH 并将更改反映在路径变量上。例如:@PatchMapping("user/{id}/{status}")public boolean setStatus(@PathVariable id, @PathVariable status) {   User currentUser = userRepo.findOne(id);   currentUser.setStatus(status);   userRepo.save(currentUser);   // ...}如果打算对未定义数量的字段进行更改,您可以使用 PUT,在请求正文中包含数据并使用 DTO 模式。你可以在网上找到很多关于 DTO 模式的例子。在这种情况下,代码如下。@PatchMapping("user/{id}")public boolean updateUser(@PathVariable id, @RequestBody UserDTO userDTO) {   // UserMapper is the mapper class which returns you a new User   // populated with the data provided in the data transfer object.   User user = UserMapper.makeUser(userDTO);   userRepo.update(id, user);   // ...}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java