我正在嘗試將請求正文決議為一個物件(我正在使用 Java Spring 引導)。
這是我的控制器的樣子:
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;
}
我的請求類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;
我可以看到userLockRequest.getLocker()在UserService始終為空。
我正在嘗試將 a 分配Locker給一個User物件并將其保存在資料庫中。
我不確定如何locker_id從UserLockRequest用于接受請求的 PUT 請求映射。
任何幫助深表感謝 :)
uj5u.com熱心網友回復:
您需要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回傳Locker給定 ID 的方法。
最后,避免在Optional.get()不檢查Optional不為空的情況下使用,否則,您可能會得到一個NoSuchElementException. 您可以按照以下方式做一些事情:
public User lockUser(Long userId, UserLockRequest userLockRequest) {
Optional<User> optionalUser = userRepository.findById(userId);
Locker locker = lockerService.getById(userLockRequest.getLockerId());
if (optionalUser.isPresent()) {
User user = optionalUser.get();
user.setLocker(locker);
userRepository.save(user.);
return user;
} else {
// throw some custom exception or just return null, it is your decision
}
}
uj5u.com熱心網友回復:
好吧,我假設
- 您有一個 User 物體和一個 Lock 物體,您需要針對用戶物體標記一個 Lock 物體
- 您有 User 和 Lock 物體的 JpaRepository 介面。
- 您的專案中有 lombok 依賴項
如果這是正確的,下面是我將實施的解決方案。這有助于更好的 API 設計和分離控制器和服務類之間的職責。
- 定義
UserLockRequest請求體類
@Getter
@Setter
public class UserLockRequest{
@NotNull
@NotBlank
private int userId;
@NotNull
@NotBlank
private long lockerId;
}
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
}
}
}
UserController班級
public class UserController {
@PutMapping("/lock")
public Optional<User> lockUser(@Validated @RequestBody UserLockRequest userLockRequest) {
return userService.lockUser(userLockRequest);
}
}
- 現在下面是你的 http 呼叫的樣子
curl --location --request PUT 'http://localhost:8081/user/lock/ \
--header 'Content-Type: application/json' \
--data-raw '{
"user_id": 8,
"locker_id":"1"
}'
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/363544.html
