如何使用带有Jetty的Spring WebClient而不是Netty?

时间:2017-10-30 15:30:31

标签: spring-boot jetty netty spring-webflux

根据documentation,可以将Spring Reactive WebClient与不同的服务器一起用作Netty:

  

WebClient通过HTTP客户端库提供更高级别的API。通过   默认它使用Reactor Netty,但可以使用不同的插件   ClientHttpConnector。

然而,我无法找到办法如何做到这一点。如果我只是将依赖从Netty更改为Jetty:

compile('org.springframework.boot:spring-boot-starter-webflux') {
       exclude group: 'org.springframework.boot', module: 'spring-boot-starter-reactor-netty'
}
compile group: 'org.springframework.boot', name: 'spring-boot-starter-jetty', version: '2.0.0.M5'

我的申请将无法启动:

2017-10-30 15:40:43.328 ERROR 20298 --- [  restartedMain] o.s.boot.SpringApplication               : Application startup failed

java.lang.NoClassDefFoundError: reactor/ipc/netty/http/client/HttpClient

显然我需要做更多的事情。但是这个github issue给我的印象是没有Netty就无法使用WebClient。

是否可以替换WebClient的Netty实现?

2 个答案:

答案 0 :(得分:2)

目前,在Spring Framework中,WebClient只有一个可用的ClientHttpConnector实现,由Reactor Netty提供支持。这解释了当前的情况 - 使用WebClient意味着您需要Reactor Netty作为依赖。

请注意,有关支持Jetty客户端的现有问题,请参阅SPR-15092

答案 1 :(得分:2)

添加依赖项:

org.eclipse.jetty:jetty-reactive-httpclient:1.0.3

然后:

HttpClient httpClient = new HttpClient();
ClientHttpConnector connector = new JettyClientHttpConnector(httpClient);

WebClient webClient = WebClient.builder().clientConnector(connector).build();

来源:https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html#webflux-client-builder-jetty