Нет подходящего компонента, ожидаемый единственный соответствующий компонент, но найден 2 - PullRequest
0 голосов
/ 15 марта 2019

Я искал в Интернете и в стеке, но не могу найти решение своей проблемы:

Unable to find bean reference for type 'class com.consol.citrus.http.client.HttpClient'Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.consol.citrus.http.client.HttpClient' available: expected single matching bean but found 2: server1BasicAuthClient,server2BasicAuthClient

Чтобы набросать некоторую справочную информацию: мне нужно создать небольшое приложение с использованием Spring 5 и Citrus Framework для автоматизации наших интеграционных тестов.

Я определил следующие бины:

@Configuration 
public class EndpointAuthentication {

public String server1Host;

public int server1Port;

public String server2Host;

public int server2Port;

@Bean(name="server1BasicAuthClient")
public com.consol.citrus.http.client.HttpClient server1BasicAuthClient() throws Exception {
    return CitrusEndpoints.http()
            .client()
            .requestUrl(String.format("http://%s:%s/", server1Host, server1Port))
            .requestFactory(sslRequestFactory(server1Host,server1Port))
            .build();
}

@Bean(name="server2BasicAuthClient")
public com.consol.citrus.http.client.HttpClient server2BasicAuthClient() throws Exception {
    return CitrusEndpoints.http()
            .client()
            .requestUrl(String.format("http://%s:%s/", server2Host, server2Port))
            .requestFactory(sslRequestFactory(server2Host,server2Port))
            .build();
}

}

И я попытался ввести свой Боб так:

public class AuthenticationIT {

@Autowired
@Qualifier("server1BasicAuthClient")
@CitrusEndpoint
private HttpClient server1BasicAuthClient;

@Autowired
@Qualifier("server2BasicAuthClient")
@CitrusEndpoint
private HttpClient server2BasicAuthClient;
....

}

Есть идеи, где и как решить проблему?

Спасибо заранее.

1 Ответ

1 голос
/ 15 марта 2019

Если вы намереваетесь выразить внедрение, основанное на аннотациях, по имени, не используйте в первую очередь @Autowired, даже если он технически способен ссылаться на имя компонента через значения @Qualifier.Вместо этого используйте аннотацию JSR-250 @Resource, которая семантически определена для идентификации конкретного целевого компонента по его уникальному имени, причем объявленный тип не имеет значения для процесса сопоставления.

Как конкретное следствие этой семантикиРазница заключается в том, что bean-компоненты, которые сами определены как тип коллекции или типа карты, не могут быть внедрены через @Autowired, потому что сопоставление типов не применимо к ним должным образом.Используйте @Resource для таких bean-компонентов, ссылаясь на конкретную коллекцию или bean-компонент карты с уникальным именем.

@ Autowired применяется к полям, конструкторам и методам с несколькими аргументами, позволяя сужать аннотации квалификаторов на уровне параметров.Напротив, @Resource поддерживается только для полей и методов установки свойств бинов с одним аргументом.Как следствие, придерживайтесь квалификаторов, если ваша цель внедрения - конструктор или метод с несколькими аргументами.


Попробуйте установить, используя value вместо name ИЛИ используйте @ Primaray

@Bean(value="server1BasicAuthClient")
@Bean(value="server2BasicAuthClient")

см. 1 см. 2

...