我正在開發一個 Spring Boot 應用程式。進入服務類我有這個服務方法:
@Override
public User getUserById(Integer userId) {
Optional<User> retrievedUser = this.userRepository.findById(userId);
return retrievedUser.get();
}
像往常一樣,它呼叫 Spring Data JPA findById()方法回傳一個Optional物件。
我正在回傳用戶物件。在這里我有以下疑問:如果Optional為空,則在執行此操作時會引發例外:
retrievedUser.get()
所以現在......當我有一個Optional物件時,處理這種情況的最常見方法是什么。
前面的服務方法被呼叫到實作 API 的控制器方法中,這個:
@ApiOperation(
value = "Retrieve an user by its id",
notes = "",
produces = "application/json")
@GetMapping(value = "/{useridOrEmail}", produces = "application/json")
public ResponseEntity<User> getUserByIdOrEmail(@PathVariable("useridOrEmail") String userIdOrEmail,
@RequestParam(value="isEmail", required = false, defaultValue = "false") boolean isEmail)
throws NotFoundException {
log.info(String.format("****** Retrieve the user having ID or email: %s *******", userIdOrEmail));
User retrievedUser = null;
if(!isEmail)
retrievedUser = this.userService.getUserById(Integer.parseInt(userIdOrEmail));
else
retrievedUser = this.userService.getUserByemail(userIdOrEmail);
if (retrievedUser == null) {
String ErrMsg = String.format("The user having ID or email %s was not found", userIdOrEmail);
log.warning(ErrMsg);
throw new NotFoundException(ErrMsg);
}
return new ResponseEntity<User>(retrievedUser, HttpStatus.OK);
}
正如您在我的控制器方法中看到的那樣,我正在檢查上一個服務的結果是否為空,以防引發例外。此例外由擴展ResponseEntityExceptionHandler的類處理,以創建正確的回應。
所以我的想法是改變我的服務方法,把這個retrievedUser.get()操作放到try catch 中。如果我獲得例外,我的getUserById()服務方法將回傳null,因此我的控制器方法將拋出NotFoundException例外,該例外將由 Spring 處理并回傳特定的錯誤回應。
可能是一個很好的解決方案或存在更好的方法來處理這種情況?
uj5u.com熱心網友回復:
我會從服務中回傳 Optionals 然后你可以像這樣很好地鏈接它們:
public ResponseEntity<User> getUserByIdOrEmail(@PathVariable("useridOrEmail") String userIdOrEmail,
@RequestParam(value="isEmail", required = false, defaultValue = "false") boolean isEmail)
throws NotFoundException {
log.info(String.format("****** Retrieve the user having ID or email: %s *******", userIdOrEmail));
return fetchUser(userIdOrEmail, isEmail)
.map((user) -> new ResponseEntity<User>(user, HttpStatus.OK))
.orElseThrow(() -> new NotFoundException(String.format("The user having ID or email %s was not found", userIdOrEmail)));
}
private Optional<User> fetchUser(String idOrEmail, boolean isEmail) {
return isEmail
? this.userService.getUserByemail(idOrEmail)
: this.userService.getUserById(Integer.parseInt(idOrEmail));
}
并且記錄警告應該在一個常見的例外處理程式中處理,該處理程式記錄所有未找到的類似方式。
uj5u.com熱心網友回復:
一個好的方法是接受資料庫回傳的任何內容。然后控制器應該決定做什么:
Optional<User> retrievedUser = isEmail
? this.userService.getUserByemail(userIdOrEmail)
: this.userService.getUserById(Integer.parseInt(userIdOrEmail));
if (!retrievedUser.isPresent()) {
String ErrMsg = String.format("The user having ID or email %s was not found", userIdOrEmail);
log.warning(ErrMsg);
throw new NotFoundException(ErrMsg);
}
return new ResponseEntity<User>(retrievedUser.get(), HttpStatus.OK);
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/408182.html
標籤:
下一篇:發布資料時為空
