SpringBoot 2.0.4.RELEASE中的ResponseEntityExceptionHandler

时间:2018-08-31 07:37:23

标签: java rest spring-mvc spring-boot

我有一个基本的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) {

...

}

我收到此编译错误:

  

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

2 个答案:

答案 0 :(得分:1)

预计此操作无法正常进行。

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

通常,您的@ExceptionHandler注释的位置似乎是错误的。这些被放置在实际异常处理类中的方法中。

我建议您对Spring以这种方式处理异常的方式有很好的了解。

请参阅以下文档:exception handling in Spring

答案 1 :(得分:1)

如果您阅读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() {
        ...
    }

}