use*_*309 5 java spring exception spring-boot
我在 Spring Boot 1.5.3 中遇到了带有 @ControllerAdvice 注释的 ExceptionHandler 的特殊情况。它捕获任何异常默认异常,但如果我抛出自定义异常它不会触发。
异常处理程序:
@ControllerAdvice
public class ResponseEntityExceptionHandler {
@ExceptionHandler({ HttpMessageNotReadableException.class })
protected ResponseEntity<ErrorModel> handleInvalidJson(RuntimeException e, WebRequest request) {
return new ResponseEntity<ErrorModel>(new ErrorModel().message("Could not parse JSON."), HttpStatus.BAD_REQUEST);
}
@ExceptionHandler({ NumberFormatException.class })
protected ResponseEntity<ErrorModel> handleInvalidRequest(RuntimeException e, WebRequest request) {
return new ResponseEntity<ErrorModel>(new ErrorModel().message("Invalid request parameter."), HttpStatus.BAD_REQUEST);
}
@ExceptionHandler({ CannotCreateTransactionException.class })
protected ResponseEntity<ErrorModel> handleTransactionCreationException(RuntimeException e, WebRequest request) {
return new ResponseEntity<ErrorModel>(new ErrorModel().message("Error connecting to the database, please make sure it is still available."), HttpStatus.BAD_REQUEST);
}
@ExceptionHandler({ NotFoundException.class })
protected ResponseEntity<ErrorModel> handleApiException(RuntimeException e, WebRequest request) {
return new ResponseEntity<ErrorModel>(new ErrorModel().message(e.getMessage()), HttpStatus.NOT_FOUND);
}
}
Run Code Online (Sandbox Code Playgroud)
前 3 个异常都按预期被捕获和处理,但底部的异常由默认的 Spring-Boot ExceptionHandler 处理。这是我在控制器中抛出的自定义异常:
public ResponseEntity<?> deleteActor(@ApiParam(value = "Used to identify a single actor.", required = true) @PathVariable("actor_id") Integer actorId, @RequestHeader("Accept") String accept) throws Exception {
Actor actor = actorRepository.findOne(actorId);
if (actor == null) {
throw new NotFoundException(404, "Not found");
}
actorRepository.delete(actorId);
return new ResponseEntity<Void>(HttpStatus.NO_CONTENT);
}
Run Code Online (Sandbox Code Playgroud)
我尝试抛出最常见的异常之一,如下所示:
public ResponseEntity<?> readActor(@ApiParam(value = "Used to identify a single actor.", required = true) @PathVariable("actor_id") Integer actorId, @RequestHeader("Accept") String accept) throws Exception {
Actor actor = actorRepository.findOne(actorId);
if (actor == null) {
throw new NumberFormatException("");
}
return new ResponseEntity<Actor>(actor, HttpStatus.OK);
}
Run Code Online (Sandbox Code Playgroud)
这些都处理得很好......
tomcat日志也显示了这一点:
2017-06-05 11:30:20.080 INFO 9076 --- [ main] .m.m.a.ExceptionHandlerExceptionResolver : Detected @ExceptionHandler methods in responseEntityExceptionHandler
Run Code Online (Sandbox Code Playgroud)
例外情况:
public class NotFoundException extends ApiException {
private int code;
public NotFoundException (int code, String msg) {
super(code, msg);
this.code = code;
}
}
Run Code Online (Sandbox Code Playgroud)
该异常继承自该基类:
public class ApiException extends Exception{
private int code;
public ApiException (int code, String msg) {
super(msg);
this.code = code;
}
}
Run Code Online (Sandbox Code Playgroud)
关于为什么自定义异常避免被 ExceptionHandler 检测到的任何想法?
如果有必要,我很乐意提供更多信息。
对于这种特殊情况,答案是使用Exception代替RuntimeException,因为 NotFoundException 仅继承自 Exception。
其他值得注意的事情:
要捕获所有异常,可以使用@ExceptionHandler(Exception.class)
如果对异常使用通用名称,请务必检查您是否导入了正确的名称。
| 归档时间: |
|
| 查看次数: |
7904 次 |
| 最近记录: |