2017-08-09 147 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)) 
} 

对于“未找到”的响应,你必须创建一个错误消息对象,并将其返回给客户端。