ServiceImpl构造函数中的Spring Boot WebClient Builder初始化

问题描述

我正在尝试使用WebClient Builder自动装配Webclient的最佳实践,但有点困惑。

这是我的主应用程序,在该应用程序中,我正在生成Webclient Builder并将其自动装配到我的服务类之一中

 @SpringBootApplication
    public class MyApplication {
        @Bean
        public WebClient.Builder getWebClientBuilder() {
            return WebClient.builder();
        }
    
        public static void main(String[] args) {
            SpringApplication.run(MyApplication.class,args);
        }}


ServiceImpl Class

    public class MyServiceImpl implements MyService {
        private static final String API_MIME_TYPE = "application/json";
        private static final String API_BASE_URL = "http://localhost:8080";
        private static final String USER_AGENT = "Spring 5 WebClient";
        private static final Logger logger = LoggerFactory.getLogger(MyServiceImpl.class);
    
        @Autowired
        private WebClient.Builder webClientBuilder;
    
        @Override
        public Mono<Issue> createIssue(Fields field) {
            return webClientBuilder.build()
                    .post()
                    .uri("/rest/api/")
                    .body(Mono.just(field),Fields.class)
                    .retrieve()
                    .bodyToMono(Issue.class);
        }}
@H_502_6@

我正在尝试使用BaseURl,DefaultHeader等构建webClientBuilder。我试图在MyServiceImpl构造函数中对其进行初始化,但不确定其是否正确。

public MyServiceImpl() {
            this.webClientBuilder
                    .baseUrl(API_BASE_URL).defaultHeader(HttpHeaders.CONTENT_TYPE,API_MIME_TYPE)
                    .defaultHeader(HttpHeaders.USER_AGENT,USER_AGENT)
                    .build();
        } 
@H_502_6@

我做对了还是正确的解决方法

当前,我有2个ServiceImpls来调用Different Apis,这就是我尝试在服务本身中设置'baseurl'和其他认值的原因。

请帮助。 TIA

解决方法

通常,您的方法将是这样的:

@SpringBootApplication
public class MyApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class,args);
    }
}

@Configuration
public class MyApplicationConfiguration {
    
    @Bean
    public WebClient myWebClient(WebClient.Builder webClientBuilder) {
        return webClientBuilder
                .baseUrl(API_BASE_URL)
                .defaultHeader(HttpHeaders.CONTENT_TYPE,API_MIME_TYPE)
                .defaultHeader(HttpHeaders.USER_AGENT,USER_AGENT)
                .build();
    }
}

@Service
public class MySericeImpl implements MyService {

    @Autowired
    private WebClient myWebClient;

    @Override
    public Mono<Issue> createIssue(Fields field) {
        return myWebClient
                .post()
                .uri("/rest/api/")
                .body(Mono.just(field),Fields.class)
                .retrieve()
                .bodyToMono(Issue.class);
    }
 }

要记住的关键是WebClient.Builder已经为您预先配置,并且Bean已经创建。因此,您只需要对其自动布线,调整配置并构建最终的WebClient

也可以使用其他方法进行配置。自定义WebClient的方法主要有3种。有关更多详细信息,请参见官方文档https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-webclient


进行编辑以使用更多API-配置多个WebClient并将其自动连接到适当的服务类中。

@Configuration
public class MyApplicationConfiguration {
    
    @Bean
    public WebClient myWebClientForApi1(WebClient.Builder webClientBuilder) {
        return webClientBuilder
                .clone()
                .baseUrl(API_1_BASE_URL)
                .defaultHeader(HttpHeaders.CONTENT_TYPE,USER_AGENT)
                .build();
    }

    @Bean
    public WebClient myWebClientForApi2(WebClient.Builder webClientBuilder) {
        return webClientBuilder
                .clone()
                .baseUrl(API_2_BASE_URL)
                .defaultHeader(HttpHeaders.CONTENT_TYPE,API_MIME_TYPE)
                .build();
    }
}