簡體   English   中英

在 Java Spring 啟動中解析請求體數據成 object

[英]Parsing request body data into object in Java Spring boot

我正在嘗試將請求正文解析為 object(我正在使用 Java Spring 引導)。

這就是我的 controller 的樣子:

public class UserController {
    @PutMapping("/lock/{id}")
    public Optional<User> lockUser(@PathVariable Long id, @Validated @RequestBody UserLockRequest user) {
        return userService.lockUser(id, user);
    }
}

我的UserService像這樣:

public Optional<User> lockUser(Long userId, UserLockRequest userLockRequest) {
    Optional<User> user = userRepository.findById(userId);

    user.get().setLocker(userLockRequest.getLocker());
    userRepository.save(user.get());
    return user;
}

我的請求 class UserLockRequest看起來像這樣:

public class UserLockRequest {
    @NotBlank
    @NotNull
    private Locker locker;

    public Locker getLocker() {
        return locker;
    }

    public void setLocker(Locker locker) {
        this.locker = locker;
    }
}

我的請求如下所示:

curl --location --request PUT 'http://localhost:8081/user/lock/8' \
--header 'Content-Type: application/json' \
--data-raw '{
    "locker_id": "1"
}'

我的User實體包含locker字段:

@OneToOne
@JoinColumn(name = "locker_id")
private Locker locker;

我可以看到UserService中的userLockRequest.getLocker()始終是 null。

我正在嘗試將Locker分配給User object 並將其保存在數據庫中。

我不確定如何將 PUT 請求中的UserLockRequest locker_id用於接受請求的 UserLockRequest。

任何幫助深表感謝:)

您需要從數據庫中獲取Locker並將其分配給User 為了實現這一點,您需要進行一些更改:

public class UserLockRequest {
    private long locker_id;  // so that it matches your JSON, but it should really be "lockerId" and you should update your JSON

    // getter / setter
}

然后,您還需要調整UserService代碼以從數據庫中獲取Locker

public Optional<User> lockUser(Long userId, UserLockRequest userLockRequest) {
    Optional<User> user = userRepository.findById(userId);
    Locker locker = lockerService.getById(userLockRequest.getLockerId());

    user.get().setLocker(locker);
    userRepository.save(user.get());
    return user;
}

我假設你有一個LockerService ,它的方法返回一個給定 ID 的Locker

好吧,我假設

  1. 您有一個用戶實體和一個鎖定實體,您需要針對用戶實體標記鎖定實體
  2. 您擁有 User 和 Lock 實體的 JpaRepository 接口。
  3. 您的項目中有 lombok 依賴項

如果這是正確的,下面是我將實施的解決方案。 這有助於更好的 API 設計和分離 Controller 和服務類之間的責任。

  1. 定義UserLockRequest請求體 class
@Getter
@Setter
public class UserLockRequest{
   
   @NotNull
   @NotBlank
   private int userId;

   @NotNull 
   @NotBlank
   private long lockerId;
}
  1. 用戶服務UserService 我使用 spring 推薦的基於構造函數的注入。
@Service
public class UserService {
    
    private final UserRepository userRepository;
    private final LockerRepository lockerRepository;
    
    public UserService(UserRepository userRepository, LockerRepository lockerRepository) {
        this.userRepository = userRepository;
        this.lockerRepository = lockerRepository;
    }

    public User lockUser(UserLockRequest userLockRequest) {
        Optional<User> optionalUser =
                userRepository.findById(userLockRequest.getUserId());
        Optional<Locker> locker = lockerRepository.findById(userLockRequest.getLockerId());

        if (optionalUser.isPresent() && locker.isPresent()) {
            User user = optionalUser.get();
            user.setLocker(locker.get());
            userRepository.save(user);
            return user;
        } else {
            // Error handling is upto you based on what requirement you have
        }
    }
}
  1. 用戶控制器UserController
public class UserController {
    @PutMapping("/lock")
    public Optional<User> lockUser(@Validated @RequestBody UserLockRequest userLockRequest) {
        return userService.lockUser(userLockRequest);
    }
}
  1. 現在下面是您的 http 調用的樣子
curl --location --request PUT 'http://localhost:8081/user/lock/ \
--header 'Content-Type: application/json' \
--data-raw '{
    "user_id": 8,
    "locker_id":"1"
}'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM