java - 在 Spring Boot 2.0.4.RELEASE 中的 RestController 中捕获 ArithmeticException

标签 java rest spring-mvc spring-boot

我有一个基本的 SpringBoot 2.0.4.RELEASE 应用程序。使用Spring Initializer、JPA、嵌入式Tomcat、Thymeleaf模板引擎,打包为可执行JAR文件。

我创建了这个类来管理异常:

@ControllerAdvice
@RestControllerAdvice
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {

    public RestResponseEntityExceptionHandler() {
        super();
    }


    // 500

    @ExceptionHandler({ NullPointerException.class, IllegalArgumentException.class, IllegalStateException.class, RuntimeException.class })
    /*500*/
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public BodyBuilder handleInternal(final RuntimeException ex, final WebRequest request) {
        logger.error("500 Status Code", ex);

        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

该方法处理 RuntimeException 和 ArithmeticException 扩展 RuntimeException。

为了测试它,我创建了这个方法;

GetMapping(path = "/getUsers", consumes = "application/json", produces = "application/json")
public ResponseEntity<List<User>> testErrors(HttpServletRequest request) {

    double ss = 3 /0;

    return ResponseEntity.ok(userService.findAll());

}

期望它只会返回一个 HttpStatus.INTERNAL_SERVER_ERROR 但它会返回“

{"timestamp":"2018-08-31T09:21:21.717+0000","status":500,"error":"Internal Server Error","message":"/ by zero","trace":"java.lang.ArithmeticException: / by zero\n\tat ...

用这个方法

 @ExceptionHandler({ NullPointerException.class, IllegalArgumentException.class, IllegalStateException.class, RuntimeException.class })
    /*500*/
    public BodyBuilder handleInternal(final RuntimeException ex, final WebRequest request) {
        logger.error("500 Status Code", ex);
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR);
    }

我有完整的跟踪:{"timestamp":"2018-09-03T07:04:58.803+0000","status":500,"error":"Internal Server Error","message":"/零","trace":"java.lang.ArithmeticException:/零\n\tat

对于这个,我在控制台中没有看到任何带有 curl 的内容:

 @ExceptionHandler({ NullPointerException.class, IllegalArgumentException.class, IllegalStateException.class, RuntimeException.class })
    /*500*/
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public void handleInternal(final RuntimeException ex, final WebRequest request) {
        logger.error("500 Status Code", ex);

    }

还有另一个,控制台中也没有任何内容:

@ExceptionHandler({ NullPointerException.class, IllegalArgumentException.class, IllegalStateException.class, RuntimeException.class })
    /*500*/
    public ResponseEntity<Object> handleInternal(final RuntimeException ex, final WebRequest request) {
        logger.error("500 Status Code", ex);


        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();

    }

最佳答案

也许 piradian没有特别指出,但问题似乎是你的 handleInternal 的返回类型方法。在您提供的代码中,返回类型为 BodyBuilder然后您返回 ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) 返回的值.实际上,作为 BodyBuilder顾名思义,它代表了 Builder pattern 的实现.在这种情况下你实际应该做的是:

return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();

并将方法的返回类型更改为ResponseEntityResponseEntity<Object> (你的 body 是空的,所以真的没有什么大的区别)。

但是,考虑到您的示例中没有返回正文,并且您的方法已经用 @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) 注释了, 你所能做的就是将返回类型更改为 void并且不返回任何东西 - 这正是 piradian建议。这也应该有效。

关于java - 在 Spring Boot 2.0.4.RELEASE 中的 RestController 中捕获 ArithmeticException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52112332/

相关文章:

java - 在工具栏和上下文菜单之间共享功能

javascript - 括号内带有参数的 REST API URL 资源

java - Spring Security 过滤掉所有情况

html - accept-charset ="UTF-8"参数在表单中使用时不执行任何操作

java - 无法将 Simple Spring MVC 项目部署到 AWS Tomcat 8

java - GWT 文件上传 OnClick

java - 将伪代码转换为尽可能相似的实现

java - 如何将 JTable 滚动到特定值?

rest - 为什么我们在 Restful API 中使用不同的动词?

scala - 如何在Scalatra中定义子资源路由