Компонент Spring не может найти компонент свойств конфигурации - PullRequest
0 голосов
/ 04 августа 2020

Я пишу тест с использованием TestNG и Spring Framework (вместе с Spring Boot), и я столкнулся с тем, что контекст приложения не может найти конкретный bean-компонент свойств конфигурации. оба упомянуты в тесте. Простое представление настройки, вызывающей проблему, будет включать следующие конфигурации:

@EnableConfigurationProperties
public class SomePropertyConfiguration {

    @Bean(name = "someConfiguration")
    @ConfigurationProperties(prefix = "test.prefix")
    public CustomPropertyClass customPropertyClass(){
        return new CustomPropertyClass();
    }

}

@Configuration
public class SomeConfiguration {

    public ISomethingApi somethingApi(CustomPropertyClass customPropertyClass){
        return new SomethingApi(customPropertyClass.getProperty());
    }
}

Тест настраивается простым способом, просто для проверки пары основных свойств:

@TestPropertySource("classpath:/test.properties")
@ContextConfiguration(classes = { SomePropertyConfiguration.class, SomeConfiguration.class })
public class SomethingApiTest extends AbstractTestNGSpringContextTests {

    @Inject
    private ISomethingApi somethingApi;

    @Test
    public void test(){
        // Do stuff
    }
}

Конечным результатом этих настроек является исключение, когда конфигурация для SomethingApi не может найти допустимый bean-компонент типа CustomPropertyClass.

Стоит отметить, что если SomeConfiguration удаляется из теста, а CustomPropertyClass вводится в тест напрямую, все работает, а свойства являются ожидаемыми значениями, что вызывает наибольшее недоумение в этой проблеме - так что что-то, похоже, заставляет Spring неправильно обрабатывать порядок подключения для beans. У меня есть аналогичные настройки в других проектах, которые работают, как ожидалось, но мне не удалось найти каких-либо значимых различий, которые могли бы вызвать такое поведение (оба проекта находятся в одной и той же основной версии Spring и Spring Boot)

EDIT:

Я пробовал с @Configuration и без * на SomePropertyConfiguration, без каких-либо изменений в результатах. В другом проекте, упомянутом в этой работе, класс конфигурации свойств не включает эту явную аннотацию, поэтому я оставил ее в основном примере выше. Я также попытался использовать поле @Autowired компонента свойства во второй конфигурации и ссылаться на него таким образом для зависимости, а не как параметр (в случае, если это повлияло на порядок подключения или что-то в этом роде), что также не повлияло на результаты.

Я использую Spring framework 5.1.7.RELEASE и Spring Boot 2.0.9.RELEASE

1 Ответ

1 голос
/ 04 августа 2020

После некоторого дополнительного исследования я обнаружил в журналах следующее:

a definition for bean 'someConfiguration' already exists. This top-level bean definition is considered as an override

оказывается, что в этом случае соглашения об именах в моем проекте вызвали конфликт между именем класса свойств bean-компонент и bean-компонент общей конфигурации проекта. Как bean-компоненты, так и классы конфигурации, похоже, совместно используют пространство имен и не вызовут сбой / ошибку (напрямую), если они столкнутся

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...