当前位置: 首页 > 知识库问答 >
问题:

Spring Boot@ControllerAdvice部分工作,对于自定义异常不工作

狄楷
2023-03-14

在Spring Boot1.5.3中,我的@ControllerAdvice注释了ExceptionHandler有一个特殊的情况。它捕获任何异常默认异常,但如果我抛出一个自定义异常,它不会激发。

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);
}
}

最上面的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);
}

我试着抛出了一个像这样的顶级异常:

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);
}

这些都处理得很好...

tomcat日志还显示:

2017-06-05 11:30:20.080  INFO 9076 --- [           main] .m.m.a.ExceptionHandlerExceptionResolver : Detected @ExceptionHandler methods in responseEntityExceptionHandler
public class NotFoundException extends ApiException {
private int code;
public NotFoundException (int code, String msg) {
    super(code, msg);
    this.code = code;
}
}
public class ApiException extends Exception{
private int code;
public ApiException (int code, String msg) {
    super(msg);
    this.code = code;
}
}

关于为什么自定义异常避免被ExceptionHandler检测到有什么想法吗?

如有必要,我很乐意提供补充资料。

共有1个答案

微生翼
2023-03-14

对于这种特殊情况,答案是使用exception而不是runtimeexception,因为NotFoundException仅从Exception继承。

其他值得注意的事项:

>

  • 要捕获所有异常,可以使用@exceptionhandler(exception.class)

  •  类似资料:
    • 我的Spring Boot服务将执行一项工作,并在成功后退出0(没有restcontroller),但我也希望它在每个异常时退出,因此我在类上添加了并放置了以下方法: 一切正常,但当我抛出一个IllegalArgumentException时,方法不会被调用。首先,我有一个没有参数的void方法,然后我开始尝试使用字符串返回和至少一个参数--这是不需要的。 这怎么行?有没有更好的方法让我的案例对每

    • 我为某些日志目的创建了一个自定义注释。此注释应用于通过扩展JpaRepository在项目中创建的Spring jpa存储库。所以现在发生的是,对于read方法,它可以正常工作,但对于保存部分,永远不会调用@周围建议。以下是我的@周围建议 我的log方法是采用一个布尔参数,并以此为基础记录一些东西。以下是回购代码 现在,当我调用不属于我的存储库MyRepo的repo方法时,比如save、saveA

    • 我有一个自定义分类法分配给一个自定义帖子类型。我创建了一个名为“taxonomy brands.php”的模板,当我访问自定义分类法存档时会调用该模板,但是当我调用该模板中的循环时,它认为我没有任何帖子(它跳过if(have_posts())并执行else{}).我的自定义帖子类型为“has_archive”= 代码中是否有可能导致这种情况?提前感谢你的帮助。 这是我用来注册CPT的代码。 这是我

    • 我想为我的应用程序使用自定义异常处理程序。但是,它不能正常工作。 ApplicationExceptionHandler.java authFilterRegistration.java ErrorEntity.java 使用这些代码,我希望有一个像这样的异常错误 这是的实例,但我得到了以下输出 从示例中可以清楚地看出,我无法完全覆盖默认的Java异常。仅更改成功的消息部分。我错过什么了吗?

    • 我有一个使用的自定义记录器,我希望它总是在最后一次运行,这样无论控制器返回什么响应,它都将被记录到数据库中(所以我在这个方面放了一个)。我还使用编写了一个错误处理程序,它处理所有意外的异常并返回,并带有自定义响应体,我希望日志记录器也记录它,因此我在它上添加了,但是看起来注释并没有在Spring方面和Spring ControllerAdvision之间安排顺序,那么如何让错误处理程序始终在日志记

    • 如果Spring批处理作业业务逻辑出现ArrayIndexOutOfBoundsException,我必须从我的自定义映射器FieldSetMapper of reader FlatFileItemReader中跳过一个自定义异常(CSVFieldMappingException)。为此,我添加了作业步骤的配置,如下所示。 但这不起作用,因为每当我抛出自定义RunTimeException时,就会