Переопределение атрибута аннотации Spring Boot не работает на компонентах

#java #spring #spring-boot

#java #spring #spring-boot

Вопрос:

Я пытаюсь создать пользовательскую аннотацию для включения функциональности на основе флагов функций. Я основываю свой подход на ConditionalOnProperty аннотации, но для обеспечения возможности повторного использования кода я хочу определить общий префикс, который можно использовать везде, где мне нужна эта функциональность.

Я определил свою аннотацию, как показано ниже.

 @Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@Documented
@ConditionalOnProperty(prefix = "foo.bar")
public @interface ConditionalOnFeature {
    @AliasFor(annotation = ConditionalOnProperty.class, attribute = "value")
    String[] value();
}
 

Я использую AliasFor аннотацию для установки value атрибута в ConditionalOnProperty аннотации и жестко кодирую свой префикс как foo.bar (все мои функции будут находиться под этим свойством).). Насколько я понимаю переопределение аннотации Spring, это должно сработать.

Однако, когда я использую это для класса (например, контроллера), код не компилируется, указывая, что The name or value attribute of @ConditionalOnProperty must be specified .

 @RestController
@ConditionalOnFeature("enable-fancy-controller")
public class FancyController {

    @RequestMapping(value = "/fancy-method", method = RequestMethod.GET)
    public String fancyMethod() {
        return "Fancy";
    }
}
 

Однако он отлично работает, когда я вместо этого использую свою аннотацию для метода. Успешно компилируется и ведет себя так, как задумано.

 @RestController
public class FancierController {

    @ConditionalOnFeature("enable-fancier-method")
    @RequestMapping(value = "/fancier-method", method = RequestMethod.GET)
    public String fancierMethod() {
        return "Fancier";
    }
}
 

Я неправильно настроил свою аннотацию? Или это какая-то ошибка с Spring?