Java Spring ExceptionHandler 控制器语法和良好实践
Java Spring ExceptionHandler Controller syntax and good practices
我想在 Spring 中正确处理我的异常,所以我有一个关于异常处理程序语法的问题:是否可以在控制器中抛出特定异常,如果它们被异常处理程序捕获?
更具体地说:
这是例外情况:
public class UnknownUserException extends Exception {
private static final long serialVersionUID = 1L;
public UnknownUserException(String message) {
super(message);
}
}
这是具有 UnknownUserException 特定方法的 ExceptionHandler:
@ControllerAdvice
@ResponseBody
public class ControllerExceptionHandler {
@ExceptionHandler(UnknownUserException.class)
@ResponseStatus(value = HttpStatus.NOT_FOUND)
public ErrorMessage unknownUserExceptionMessage(UnknownUserException ex, WebRequest request) {
ErrorMessage message = new ErrorMessage("The user doesn't exist: " +ex.getLocalizedMessage(), ex);
return message;
}
}
这是一个可能引发该异常的映射示例:
@GetMapping({"/user/{id}"})
public ResponseEntity<UserProfileDto> getById(@PathVariable Long id) throws UnknownUserException {
UserProfileDto user = userService.findById(id);
return ResponseEntity.ok(user);
}
userService.findById(id) 可能会抛出 UnknownUserException。
根据我的理解,controllerAdvice 在服务抛出特定异常的情况下“覆盖”控制器,但是,我应该如何处理我的控制器?我应该再次抛出异常(如上所示)还是捕获特定异常并 return a ResponseEntity(HttpStatus.NOT_FOUND) ?
在理想情况下,当已知您的情况时应立即抛出异常,因为您提到服务方法会抛出 UnknownUserException
正确的做法。您的 Controller Advice 应该能够处理该异常。 ContollerAdvice
将处理在执行请求期间抛出的任何匹配异常,而不管异常的来源。
参考this link了解其他处理异常的选项
我想在 Spring 中正确处理我的异常,所以我有一个关于异常处理程序语法的问题:是否可以在控制器中抛出特定异常,如果它们被异常处理程序捕获?
更具体地说:
这是例外情况:
public class UnknownUserException extends Exception {
private static final long serialVersionUID = 1L;
public UnknownUserException(String message) {
super(message);
}
}
这是具有 UnknownUserException 特定方法的 ExceptionHandler:
@ControllerAdvice
@ResponseBody
public class ControllerExceptionHandler {
@ExceptionHandler(UnknownUserException.class)
@ResponseStatus(value = HttpStatus.NOT_FOUND)
public ErrorMessage unknownUserExceptionMessage(UnknownUserException ex, WebRequest request) {
ErrorMessage message = new ErrorMessage("The user doesn't exist: " +ex.getLocalizedMessage(), ex);
return message;
}
}
这是一个可能引发该异常的映射示例:
@GetMapping({"/user/{id}"})
public ResponseEntity<UserProfileDto> getById(@PathVariable Long id) throws UnknownUserException {
UserProfileDto user = userService.findById(id);
return ResponseEntity.ok(user);
}
userService.findById(id) 可能会抛出 UnknownUserException。
根据我的理解,controllerAdvice 在服务抛出特定异常的情况下“覆盖”控制器,但是,我应该如何处理我的控制器?我应该再次抛出异常(如上所示)还是捕获特定异常并 return a ResponseEntity(HttpStatus.NOT_FOUND) ?
在理想情况下,当已知您的情况时应立即抛出异常,因为您提到服务方法会抛出 UnknownUserException
正确的做法。您的 Controller Advice 应该能够处理该异常。 ContollerAdvice
将处理在执行请求期间抛出的任何匹配异常,而不管异常的来源。
参考this link了解其他处理异常的选项