繁体   English   中英

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

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

我正在尝试编写 RestControllerAdvice,它是一个通用库的一部分,我希望在某个属性的当前可用。 根据我们的公共库,我们通过配置而不是注释来定义所有 bean,以便我们可以按需导入该配置类,而不是总是创建这些 bean。 但是我发现很难提到 bean 实际上是 Spring 配置类中的 RestControllerAdvice 类型。

下面是我的 RestControllerAdvice。 我从这个 ExceptionHandler 中删除了@RestControllerAdvice否则无论如何都会创建这个 bean,在我的配置类中我添加了@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 可以从内部类创建 bean,据我测试,甚至可以成功创建private和非静态类的实例。

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

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

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

笔记

  • @RestControllerAdvice / @ControllerAdvice注解只能在类级别使用,不能在方法级别使用。 因此,您需要声明一个类并使用其中一个来注释该类。

  • @AliasFor注释,正如其 javadoc 所说,“用于声明注释属性的别名”( @RestControllerAdvice的源代码就是一个很好的例子)。 所以,我认为@AliasFor(annotation = RestControllerAdvice.class)在你上面的源代码中什么都不做。

也可以看看

Spring 框架文档核心技术 - 1.3.2。 实例化 Bean

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM