[英]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
。
好吧,我假設
如果這是正確的,下面是我將實施的解決方案。 這有助於更好的 API 設計和分離 Controller 和服務類之間的責任。
UserLockRequest
請求體 class@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);
}
}
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.