gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:09:58 26 4
gpt4 key购买 nike

我正在尝试遵循使用 WebClient Builder Autowiring Webclient 的最佳实践,但很少混淆。
这是我的主要应用程序,我正在其中生成一个 Webclient Builder 并在我的一个服务类中 Autowiring 它

 @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);
}}
我正在尝试使用 BaseURl、DefaultHeader 等构建 webClientBuilder。我尝试在 MyServiceImpl Constructer 中对其进行初始化,但不确定它是否正确。
public MyServiceImpl() {
this.webClientBuilder
.baseUrl(API_BASE_URL).defaultHeader(HttpHeaders.CONTENT_TYPE, API_MIME_TYPE)
.defaultHeader(HttpHeaders.USER_AGENT, USER_AGENT)
.build();
}
我这样做是正确的还是有更好的方法来做到这一点。
目前我有 2 个 ServiceImpls 来调用不同的 API,这就是我试图在服务本身中设置“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。所以你只需要 Autowiring 它,调整配置并构建最终 WebClient .
也可以使用另一种方法来配置它。有 3 种主要的定制方法 WebClient .更多详情请查看官方文档 https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-webclient .

编辑以使用更多 API - 配置多个 WebClient 并在适当的服务类中 Autowiring 它们。
@Configuration
public class MyApplicationConfiguration {

@Bean
public WebClient myWebClientForApi1(WebClient.Builder webClientBuilder) {
return webClientBuilder
.clone()
.baseUrl(API_1_BASE_URL)
.defaultHeader(HttpHeaders.CONTENT_TYPE, API_MIME_TYPE)
.defaultHeader(HttpHeaders.USER_AGENT, 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();
}
}

关于java - ServiceImpl 构造函数中的 Spring Boot WebClient Builder 初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64595350/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com