簡體   English   中英

什么是處理 Optional 的好方法<user> object 在這種情況下由 Spring 數據 JPA 存儲庫返回?</user>

[英]What is a good way to handle an Optional<User> object returned by a Spring Data JPA repository in a situation like this?

我正在開發 Spring 引導應用程序。 進入服務 class 我有這個服務方法:

@Override
public User getUserById(Integer userId) {
    Optional<User> retrievedUser = this.userRepository.findById(userId);
    return retrievedUser.get();
}

像往常一樣,它調用 Spring 數據 JPA findById()方法返回一個可選的 object。

我正在返回用戶object。 在這里我有以下疑問:如果Optional,則在執行此操作時會引發異常:

retrievedUser.get()

所以現在......當我有一個可選的 object 時,處理這種情況的最常見方法是什么。

前面的服務方法被調用到實現 API 的 controller 方法中,這個:

@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);
        
}

正如您在我的 controller 方法中看到的那樣,我正在檢查先前服務的結果是否為 null,以防拋出異常。 此異常由 class 擴展ResponseEntityExceptionHandler以創建正確響應的方式處理。

所以我的想法是改變我的服務方法,把這個retrievedUser.get()操作放到try catch中。 如果我獲得異常,我的getUserById()服務方法將返回null ,因此我的 controller 方法將拋出NotFoundException異常,該異常將由 Z38008DD81C2F4D7981Z.

可能是一個很好的解決方案或存在更好的方法來處理這種情況?

我會從服務中返回 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));
}

並且記錄警告應該在一個常見的異常處理程序中處理,該處理程序記錄所有未找到的類似方式。

一個好的方法是接受數據庫返回的任何內容。 然后 controller應該決定做什么:

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);

暫無
暫無

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

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