为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

江户川乱折腾 2021-09-29 17:07:25
我想要一些非常基本的东西。我只想更新用户。前端为用户发送一个json。 我想避免设置 currentUser 的每个值(它有 50 个字段)@PutMapping("user/{id}")public boolean updateUser(@PathVariable id, @RequestBody User user) {   User currentUser = userRepo.findOne(id);   // What now??}
查看完整描述

3 回答

?
交互式爱情

TA贡献1712条经验 获得超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);

    }



}


查看完整回答
反对 回复 2021-09-29
?
慕森王

TA贡献1777条经验 获得超3个赞

你可以参考这个关于 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);

   // ...

}


查看完整回答
反对 回复 2021-09-29
  • 3 回答
  • 0 关注
  • 171 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信