ComponentScan не находит собственных пользовательских аннотаций после обновления с Spring Boot 2.0.3 до 2.2.4 - PullRequest
0 голосов
/ 12 февраля 2020

До обновления с Spring Boot 2.0.3 до 2.2.4 у нас были некоторые аннотации, подобные следующему примеру:

import org.springframework.stereotype.Component;

@Component
public @interface Adapter {
}

Во время классов ComponentScan, аннотированных с помощью этой аннотации Adaptor, они были подобраны и добавлены к Весенний контекст. После обновления теперь есть org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'XY' available.

Согласно отрывку из терминологии Модель программирования весенних аннотаций относительно аннотаций стереотипов, наш подход должен работать:

Любой компонент, помеченный @Component, является кандидатом на сканирование компонентов. Точно так же любой компонент, помеченный аннотацией, которая сама является мета-аннотированной @Component, также является кандидатом на сканирование компонентов.

Я прочитал примечания к выпуску Spring Boot 2.1 и 2.2 и примечания к выпуску Spring Framework 5.1 и 5.2, но ничего не нашел, что поведение аннотаций стереотипа изменилось в этой точке.

Когда я аннотирую классы с помощью аннотации стереотипа, предоставленной Spring (в дополнение к нашей собственной аннотации), они выбираются с помощью ComponentScan.

Я также пытался установить пользовательский фильтр в @ComponentScan, как это

@ComponentScan(includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION,
    classes = Adapter.class))

, но все равно получил NoSuchBeanDefinitionException

Наконец Я наткнулся на это «Улучшение» в Spring Framework и подумал, может ли это быть root моей проблемы.

Так что пока ничего не получалось, и я был бы рад, если бы кто-то мог Направьте меня в направлении, которое восстанавливает первоначальное поведение, когда наши собственные аннотации стереотипов снова работают. Заранее спасибо.

1 Ответ

0 голосов
/ 12 февраля 2020

После более подробного изучения аннотаций Spring Stereotype добавление @ Retention (RetentionPolicy.RUNTIME) к нашим аннотациям решило проблему. Классы с нашими собственными аннотациями снова выбираются ComponentScan.

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

import org.springframework.stereotype.Component;

@Retention(RetentionPolicy.RUNTIME)
@Component
public @interface Adapter {
}
...