我有一个带有 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>
类型。
或
如何指定两种可能的返回类型?
答案 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();
}
}