2017-08-09 191 views
1

我正在使用帶數據JPA的Spring Boot。
我有以下代碼。函數Java的不同返回類型

帶有名稱和信息性消息的用戶類別。

class UserResponse{ 
     private String name; 
     private String message; 
    } 

User JPA Repository which find userBy id;

如果用戶沒有找到

class UserService(){ 
     UserResponse user = new UserResponse(); 
     public UserResponse getUserById(String userId){ 
     Optional<User> useroptional = userRepository.findById(userId); 
     if(userOptional.isPresent()){ 
     user.setName(userOptional.get().getName()); 
     }else{ 
     user.setMessage("User Not Found"); 
     } 
    } 

UserController中它調用回購和設置郵件

interface UserRepository{ 
     Optional<User> findUserById(String id); 
    } 

用戶服務具有以設置適當的HTTP狀態代碼按照該消息。

class UserController(){ 
     public ResponseEntity<UserResponse> getUserById(String id){ 
     UserResponse user = userService.getUserById(id); 
     HttpStatus status = OK; 
     if(!StringUtils.isEmpty(user.getMessage())){ 
      status = NOT_FOUND; 
     } 
     return new ResponseEntity<>(user,status); 
     } 
    } 

我所面對的問題是序設置在控制器層適當狀態碼我必須檢查用戶消息,這是我不喜歡。 無論如何,我們可以爲成功和失敗案例創建控制流程。

說一個成功方案的返回類型和流程,反之亦然。 我知道斯卡拉有這個功能要麼關鍵字。 Java中是否有其他替代方法? 或任何其他方法,我可以用來處理這個更好的...
一種方法是返回RepsonseEntity在服務層本身與適當的狀態代碼,但設置狀態代碼是控制器的責任是我的感覺。

回答

-1

如果發生故障,您可以將自定義Exception與適當的消息。那麼你可以在@ControllerAdvice。我會在一會兒添加一個例子。

@ControllerAdvice 
public class GlobalExceptionHandler { 

    @ExceptionHandler(MyCustomException.class) 
    public ResponseEntity<String> exception(MyCustomException e) { 

     return new ResponseEntity(e.getMessage(), HttpStatus.NotFound); 
    } 
} 

在一個@ControllerAdvice一個能有更多的方法傾聽不同Exception秒。自定義例外可以容納任何你想要的 - 這是一個普通的類 - 所以你可以返回ResponseEntity任何你想要的。

-1

例如:

@Transactional(readOnly = true) 
@GetMapping("/{id}") 
public ResponseEntity<?> getUserById(@PathVariable("id") String userId) { 

    return userRepository.findById(userId) 
        .map(user -> ResponseEntity.ok().body(user)) 
        .orElse(new ResponseEntity<>(/* new ErrorMessage */, HttpStatus.NOT_FOUND)) 
} 

對於「未找到」的響應,你必須創建一個錯誤消息對象,並將其返回給客戶端。