Spring Boot запускает @Bean в соответствии с условием

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

  @Bean
  @Qualifier("restTemplateOne")
  public RestTemplate restTemplateWithAccessToken() {
    return new RestTemplateBuilder()
      .interceptors((HttpRequest request, byte[] body, ClientHttpRequestExecution execution) -> {

        //this is the only header that i want to add for 
        request.getHeaders().set("MY_PARTICULAR_HEADER", "my value");

       request.getHeaders().set(HttpHeaders.AUTHORIZATION,"my auth value"); 

        return execution.execute(request, body);

      }).build();
  }

  @Bean
  @Qualifier("restTemplateTwo")
  public RestTemplate restTemplateWithIdToken() {
    return new RestTemplateBuilder()
      .interceptors((HttpRequest request, byte[] body, ClientHttpRequestExecution execution) -> {

        request.getHeaders().set(HttpHeaders.AUTHORIZATION,"my auth value");

        return execution.execute(request, body);

      }).build();
  }
  
  
  
  @Autowired
  @Qualifier("restTemplateOne")
  private RestTemplate restTemplateOne;
  
  @Autowired
  @Qualifier("restTemplateTwo")
  private RestTemplate restTemplateTwo;

у вас есть идеи, как я могу оптимизировать код, чтобы избежать дублирования? что-то вроде добавления параметра в метод и добавления заголовка или нет по условию.

Заранее спасибо.

Я рекомендую вам взглянуть на реализацию @FeignClient вместо RestTemplate. В этом вопросе много плюсов.

Serhii Zhura 17.05.2022 11:08

спасибо @SerhiiZhura, мы уже используем Feign, но это еще не все. у нас есть проблемы с Soap WS и отображением XML, а также вызов WS с MultipartFile, поэтому мы используем Restemplate, потому что у нас есть полный контроль над нашими вызовами WS

James 17.05.2022 11:46
0
2
25
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Просто извлеките и параметризуйте свой перехватчик:

    @Bean
    @Qualifier("restTemplateOne")
    public RestTemplate restTemplateWithAccessToken() {
        return new RestTemplateBuilder()
                .interceptors(new CustomClientHttpRequestInterceptor(true))
                .build();
    }

    @Bean
    @Qualifier("restTemplateTwo")
    public RestTemplate restTemplateWithIdToken() {
        return new RestTemplateBuilder()
                .interceptors(new CustomClientHttpRequestInterceptor(false))
                .build();
    }

    private static class CustomClientHttpRequestInterceptor implements ClientHttpRequestInterceptor {
        private boolean needParticularHeader;

        public CustomClientHttpRequestInterceptor(boolean needParticularHeader) {
            this.needParticularHeader = needParticularHeader;
        }

        @Override
        public ClientHttpResponse intercept(HttpRequest request,
                                            byte[] body,
                                            ClientHttpRequestExecution execution) throws IOException {
            if (needParticularHeader) {
                //this is the only header that i want to add for
                request.getHeaders().set("MY_PARTICULAR_HEADER", "my value");
            }

            request.getHeaders().set(HttpHeaders.AUTHORIZATION, "my auth value");

            return execution.execute(request, body);

        }
    }

спасибо @dekkard. Мне нравится ваше предложение, но я не могу извлечь перехватчик таким образом, так как у меня есть другие фиктивные вызовы, поэтому я думаю, что этот CustomClientHttpRequestInterceptor перехватит мои фиктивные вызовы и добавит заголовки. вы подтверждаете?

James 17.05.2022 11:51
CustomClientHttpRequestInterceptor будет перехватывать только те запросы, которые выполняются RestTemplate, явно настроенным на использование этого перехватчика. Feign вообще не использует RestTemplate — вместо этого он напрямую использует OkHttpClient или ApacheHttpClient. В любом случае, вы можете легко проверить, вызывается ли ваш перехватчик или нет - просто добавьте несколько журналов в перехватчик и вызовите свой клиент Feign.
dekkard 17.05.2022 12:08

спасибо работает нормально. я принял твой ответ (у)

James 17.05.2022 14:43

Другие вопросы по теме