[英]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)
在你上面的源代码中什么都不做。也可以看看
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.