我有一个基本的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) {
...
}
我收到了这个编译错误:
类型不匹配:无法从Class转换为Class>
如果您阅读docs for @ExceptionHandler
,您将看到它用于标记处理异常的方法。因此,您必须指定它可以处理的异常(例如@ExceptionHandler(MyException.class)
或@ExceptionHandler({MyException.class, MyOtherException.class})
)。在控制器中发生此类异常时,将调用此方法。
@ControllerAdvice
使类中定义的方法可用于所有控制器。
我不知道你想做什么,但既然你在ResponseEntityExceptionHandler
类中扩展@ControllerAdvice
,你可以删除@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();
}
}
现在handleException()
将在testErrors()
发生错误时被调用。
如果只想在一个控制器中处理异常,可以执行以下操作:
@Controller
public class MyController {
@GetMapping(...)
public ResponseEntity<List<User>> testErrors(...) {
throw new MyException();
}
@ExceptionHandler(MyException.class)
public ResponseEntity<?> handleMyException() {
...
}
}
预计这将无法正常工作。
你试图在你的测试方法中传入RestResponseEntityExceptionHandler
作为@ExceptionHandler
注释的参数。这是错误的,因为此批注接受被拦截的异常的类型。
另外一般来说,你的@ExceptionHandler
注释的位置似乎是错误的。它放在驻留在实际异常处理类中的方法中。
我建议你对Spring以这种方式处理异常的方式有一个很好的解读。
看看这篇文档:exception handling in Spring。