如何在 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
我正在尝试编写 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