如何在 spring 配置 class 中创建 RestControllerAdvice 类型的 spring @bean

How to create spring @bean of type RestControllerAdvice in spring configuration class

我正在尝试编写 RestControllerAdvice,它是我希望在某个 属性 的礼物上可用的公共库的一部分。根据我们的公共库,我们通过配置而不是注释定义所有 bean,以便我们可以按需导入该配置 class 而不是总是创建这些 bean。但是我发现很难在 spring 配置 class.

中提及 bean 实际上是 RestControllerAdvice 类型

下面是我的 RestControllerAdvice。我从这个 ExceptionHandler 中删除了 @RestControllerAdvice 否则无论如何都会创建这个 bean 并且在我的配置 class 我添加了 @AliasFor(annotation = RestControllerAdvice.class) 但我不确定它是否是正确的方法并且它没有用要么。

@Order(Ordered.HIGHEST_PRECEDENCE)
public class ExceptionHandler {


    @ExceptionHandler(CustomException.class)
    @ResponseBody
    public ResponseEntity<Void> handleMyException(CustomException e) {
        return new ResponseEntity(new UnauthorizedResponse().withMessage(e.getMessage()).withStatus(HttpStatus.UNAUTHORIZED.value()), null, HttpStatus.UNAUTHORIZED);
    }

}


@Configuration
public class ServiceCommonConfiguration {

    @Bean
    @AliasFor(annotation = RestControllerAdvice.class)
    @ConditionalOnProperty(name = PROPERTY, havingValue = "enable")
    public ExceptionHandler serviceCommonExceptionHandler() {
        return new ExceptionHandler();
    }
}

请试试这个:

@Configuration
public class ServiceCommonConfiguration {

    @RestControllerAdvice
    @ConditionalOnProperty(name = PROPERTY, havingValue = "enable")
    private class SpecificExceptionHandler extends ExceptionHandler {
      // Extends 'ExceptionHandler' class in your question.
    }
}

Spring 可以从内部 classes 创建 bean,据我测试,甚至 private 和非静态 classes 的实例都已成功创建。

当然,您可以通过使用 @Import 来使用此配置 class,如下所示。

@Configuration
@Import(ServiceCommonConfiguration.class)
public class SomeUserOfLibraryConfiguration {.... 

当您既不导入配置 class 也不对 Spring 组件扫描 class 的包时,不会创建异常处理程序的 bean。

注意

  • 您只能在 class 级别使用 @RestControllerAdvice/@ControllerAdvice 注释,不能在方法级别使用它们。所以你需要声明一个class并用其中之一注释class。

  • @AliasFor 注释,正如它的 javadoc 所说,'is used to declare aliases for annotation attributes'(@RestControllerAdvice 的源代码就是一个很好的例子)。所以,我认为 @AliasFor(annotation = RestControllerAdvice.class) 在上面的源代码中什么也没做。

另请参阅

Spring Framework Documentation Core Technologies - 1.3.2. Instantiating Beans