如何指定正确的返回类型?

时间:2021-07-26 03:16:08

标签: java spring-boot

我有一个带有 GET users 方法的 UserController。

public class UserController {
    private final static Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
    private final UserService userService;

    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping
    public List<User> getUsers() throws ResourceNotFoundException {
        try {
            return userService.getUsers();
        } catch (Exception e) {
            LOGGER.error(e.getMessage());
            return ResponseEntity.internalServerError().build();
        }
    }
}

问题在于返回类型。因为我要返回一个用户列表,所以我将其设置为返回类型。但由于它也可以返回 ResponseEntity,我的 IDE 会抱怨它。它提供的快速修复是将返回类型设置为 ResponseEntity,但随后它会抱怨此方法可以返回 List<User> 类型。

enter image description here

enter image description here

如何指定两种可能的返回类型?

3 个答案:

答案 0 :(得分:4)

您有两个选择:

  • 返回 ResponseEntity<E> 并使用类似 return ResponseEntity.ok(users) 的内容。
  • 不要在您的方法中捕获异常。相反,请使用 @ControllerAdvice 集中处理异常处理,以便在一处编写处理代码并始终如一地应用它。

答案 1 :(得分:2)

您不能从该方法返回一种以上的类型。取而代之的是抛出异常,调用者需要处理它。

 @GetMapping
    public List<User> getUsers() throws ResourceNotFoundException {
        try {
            return userService.getUsers();
        } catch (ResourceNotFoundException e) {
            LOGGER.error(e.getMessage());
            throw new CustomException("Error while searching for user");
        }
    }

 @GetMapping
    public List<User> getUsers() throws ResourceNotFoundException {
        return userService.getUsers();
    }

答案 2 :(得分:2)

您可以从控制器方法返回 ResponseEntity<List<User>>

它基本上包装了实际结果,但允许对返回状态进行更细粒度的控制。

有时您不必真的抛出异常并将异常处理委托给控制器建议。如果您不想捕获可能的异常 - 很好,如果异常不是在控制器本身中抛出而是来自从控制器调用的服务类,您也可以使用控制器建议。但是如果您可以处理控制器中的所有内容(例如更改响应的返回类型) - 您仍然可以使用响应实体来执行此操作,至少它似乎是一个可行的选择。

技术上你应该这样做:

    @GetMapping
    public ResponseEntity<List<User>> getUsers() throws ResourceNotFoundException {
        try {
            return ResponseEntity.ok(userService.getUsers()); // wrapped!!!
        } catch (Exception e) {
            LOGGER.error(e.getMessage());
            return ResponseEntity.internalServerError().build();
        }
    }