ResponseEntityExceptionHandler in SpringBoot 2.0.4.RELEASE



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

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

@ControllerAdvice
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
public RestResponseEntityExceptionHandler() {
super();
}
// API
// 400
...
}

但是当我尝试在我的方法之一中使用它时:

@GetMapping(path = "/getUsers", consumes = "application/json", produces = "application/json")
@ExceptionHandler({RestResponseEntityExceptionHandler.class })
public ResponseEntity<List<User>> testErrors(HttpServletRequest request, @RequestHeader(value = "Authorization") String authHeader) {
...
}

我收到此编译错误:

类型不匹配:无法从类转换为类>

如果您阅读@ExceptionHandler的文档,您将看到它用于标记处理异常的方法。因此,您必须指定它可以处理的异常(例如@ExceptionHandler(MyException.class)@ExceptionHandler({MyException.class, MyOtherException.class})(。当控制器中发生此类异常时,将调用此方法。

@ControllerAdvice使类中定义的方法可供所有控制器使用。

我不知道你想做什么,但由于你在@ControllerAdvice类中扩展了ResponseEntityExceptionHandler,你可以删除@ExceptionHandler annotation

@GetMapping(...)
public ResponseEntity<List<User>> testErrors(...) {
...
}

如果你想自己处理特定的异常,你可以这样做:

@ControllerAdvice
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(MyException.class)
public ResponseEntity<?> handleMyException() {
...
}
}
@Controller
public class MyController {
@GetMapping(...)
public ResponseEntity<List<User>> testErrors(...) {
throw new MyException();
}
}

现在,当testErrors()中发生错误时将调用handleException()

如果只想在一个控制器中处理异常,可以执行以下操作:

@Controller
public class MyController {
@GetMapping(...)
public ResponseEntity<List<User>> testErrors(...) {
throw new MyException();
}
@ExceptionHandler(MyException.class)
public ResponseEntity<?> handleMyException() {
...
}
}

预计这不能正常工作。

您正在尝试将RestResponseEntityExceptionHandler作为测试方法中@ExceptionHandler注释的参数传递。这是错误的,因为此注释接受被拦截的异常的类型。

此外,总的来说,您的@ExceptionHandler注释的位置似乎是错误的。这被放置在驻留在实际异常处理类中的方法中。

我建议你好好读一下Spring以这种方式处理异常的方式。

看看这个文档:Spring 中的异常处理。

最新更新