【问题标题】:Spring basePackageClasses from @ControllerAdvice doesn't work来自@ControllerAdvice 的 Spring basePackageClasses 不起作用
【发布时间】:2017-12-17 20:55:44
【问题描述】:

我有定义

@ControllerAdvice(basePackageClasses = MyClass.class)
public class MyClassExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(value = { MultipartException.class, FileUploadBase.FileSizeLimitExceededException.class })
    @ResponseBody
    protected ResponseEntity<Object> maximumFileSizeLimitExceeded(RuntimeException ex, WebRequest request) {

        String bodyOfResponse = "message";
        return new ResponseEntity<>(new RestErrorInfo(ex, bodyOfResponse), HttpStatus.BAD_REQUEST);

    }
}

如果我有@ControllerAdvice(basePackageClasses = MyClass.class) 我的ExceptionHandler 不能正常工作。

如果我只有 @ControllerAdvicemy ExceptionHandler 工作正确。

有什么问题?我想将我的ExceptionHandler 仅用于MyClass 课程。

【问题讨论】:

  • “我的 ExceptionHandler 不能正常工作”是什么意思?
  • 当我上传的文件大小超过我的阈值时,不要捕获异常。我只收到内部服务器错误。如果我删除 basePackageClasses 我的 bodyOfResponse 收到了错误。

标签: java spring exception-handling


【解决方案1】:

我通过将处理程序的包添加到 springboot 扫描来解决此问题。

@SpringBootApplication(scanBasePackages = "your.handler.package")

如果你使用的是spring boot,注意spring boot默认只扫描你的bootstrap类的包和子包下的bean。

因此,如果您使用 @ControllerAdvice 注释的处理程序不在这些包中,您必须手动将其包添加到扫描中。

【讨论】:

    【解决方案2】:

    使用@Controller 注释而不是@ControllerAdvice,因为@ExceptionHandler 最后一个只能用于所有控制器(所以没有basePackageClasses = MyClass.class

    【讨论】:

    • 我如何才能捕获从 MyClass 控制器收到的异常?我不想捕获所有具有最大文件大小的异常,只捕获 MyClass 中的异常?
    • 就像你之前对@ExceptionHandler 所做的那样:mkyong.com/spring-mvc/spring-mvc-exceptionhandler-example
    • 那么,你建议我将我的Controller中的ExceptionHandler方法从MyClass移走?
    • 我试图在我的控制器中移动 ExceptionHandler 与 here 相同,但不起作用。
    • 尝试按照之前评论中的链接,我建议你这样做:1)你需要用@Controller注释标记你的控制器而不是异常类; 2)在你的控制器中移动异常方法; 3)像链接中所示的普通异常类一样创建您的 ExceptionClass
    猜你喜欢
    • 2021-05-22
    • 1970-01-01
    • 2013-08-23
    • 1970-01-01
    • 2016-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    相关资源
    最近更新 更多