Spring boot: комбинация @Profile @Bean не работает - PullRequest
0 голосов
/ 10 октября 2019

Я кодировал эти два компонента:

@Bean
public HttpClient httpClient() throws Exception {
    LOG.debug("http client for NO PRE");

    return HttpClients.custom().build();
}

@Bean
@Profile("pre")
public HttpClient httpClientPre() throws Exception {
    LOG.debug("http client for PRE");

    //...

    HttpClient client = HttpClients.custom().build();

    return client;
}

С другой стороны, у меня есть еще один компонент:

@Bean
@Primary
public RestTemplate restTemplate(RestTemplateBuilder builder, HttpClient httpClient) throws Exception {
    return builder.requestFactory(() -> new HttpComponentsClientHttpRequestFactory(httpClient))
            .build();
}

Как вы можете понять, когда "pre"активен, я хочу httpClientPre достигнут. Однако, несмотря на то, что активный профиль «pre», он не достигнут. Смотрите журналы:

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.0.4.RELEASE)

13:20:31.746 [main] INFO  n.g.t.e.s.SchedulerApplication - Starting SchedulerApplication on psgd with PID 9538 (/home/jeusdi/projects/repositori-digital/rep-digital-scheduler/target/classes started by jeusdi in /home/jeusdi/projects/repositori-digital)
13:20:31.760 [main] DEBUG n.g.t.e.s.SchedulerApplication - Running with Spring Boot v2.0.4.RELEASE, Spring v5.0.8.RELEASE
13:20:31.767 [main] INFO  n.g.t.e.s.SchedulerApplication - The following profiles are active: pre  <<<<<<<<<<<<

Однако я ожидал получить журнал для "http client for PRE". Тем не менее, я получаю:

13:20:48.613 [main] DEBUG n.g.t.e.s.c.ServicesConfiguration - http client for NO PRE <<<<<<

Это означает, что httpClientPre не достигается, несмотря на текущий профиль pre.

Есть идеи?

РЕДАКТИРОВАТЬ

Я также пытался с @Profile("!pre"), но я получаю это сообщение:

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 1 of method restTemplate in net.gencat.transversal.espaidoc.scheduler.config.ServicesConfiguration required a bean named 'httpClient' that could not be found.


Action:

Consider defining a bean named 'httpClient' in your configuration.

EDIT2

Я также пытался с:

enter image description here

Но он продолжает получать сообщение выше.

Ответы [ 2 ]

0 голосов
/ 10 октября 2019

Причина в том, что вы создаете бины с 2 разными именами (имя метода == имя бина), и имя бина учитывается при внедрении - имя бина == имя аргумента.

В вашем случае вы вводите httpClient, но вы создаете httpClient и httpClientPre - таким образом httpClient вводится

с использованием @Profile("!pre") - это путь, но в сочетании с @Qualifierтак что вы можете правильно назвать бин, например

@Bean
@Profile("!pre")
public HttpClient httpClient() throws Exception 

@Bean
@Profile("pre")
@Qualifier("httpClient")
public HttpClient httpClientPre() throws Exception 
0 голосов
/ 10 октября 2019

Кажется, вы должны пометить все @Bean методы с @Profile

Согласно https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/Profile.html

ПРИМЕЧАНИЕ: С @Profile на @Для bean-методов может применяться особый сценарий: в случае перегруженных методов @Bean с тем же именем Java-метода (аналогично перегрузке конструктора) условие @Profile должно быть последовательно объявлено во всех перегруженных методах. Если условия противоречивы, будет иметь значение только условие первого объявления среди перегруженных методов. Поэтому @Profile нельзя использовать для выбора перегруженного метода с определенной сигнатурой аргумента над другим;разрешение между всеми фабричными методами для одного и того же компонента следует алгоритму разрешения конструктора Spring во время создания. Используйте разные имена методов Java, указывающие на одно и то же имя компонента, если вы хотите определить альтернативные компоненты с различными условиями профиля;см. ProfileDatabaseConfig в javadoc @ Configuration.

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