【问题标题】:spring webclient with ssl throws NPE带有ssl的spring webclient抛出NPE
【发布时间】:2020-12-26 16:12:30
【问题描述】:

我想创建一个普通的 spring webclient 来连续读取流。该流来自 https 页面。

我发现了一些“教程”,应该展示如何使用 spring webclient 来做到这一点,但他们没有。 它们要么已经过时,要么就是错误的,或者缺少很多信息,尤其是关于使用过的类。

类似 HttpClient.create()... 的东西是一个 PITA,但不知道要使用哪个确切的依赖项!

我目前的测试代码是这样的:

package chatclient;

import io.netty.handler.ssl.SslContext;
import io.netty.handler.ssl.SslContextBuilder;
import org.springframework.http.client.reactive.ReactorClientHttpConnector;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Flux;

public class SslWebClientTest {

    public static void main(String[] args) {


        try {
            SslContext sslContext = SslContextBuilder
                    .forClient()
                    .build();

            ReactorClientHttpConnector clientHttpConnector = new ReactorClientHttpConnector();
//            HttpClient.create();

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


            Flux<String> stringFlux = webClient
                    .get()
                    .uri("https://www.google.com")
                    .retrieve()
                    .bodyToFlux(String.class);
            stringFlux.subscribe(System.out::println);

        } catch (Exception e) {
            e.printStackTrace();
        }


    }

}

正如预期的那样,它会抛出 NPE,因为我不知道如何使用此处提到的 sslcontext 创建 httpclient.create() Spring WebClient - SSL configuration 因为我只是不知道这里使用的是什么 httpclient 类 - 它不是来自:apache、jdk、jetty 的那个

【问题讨论】:

    标签: java spring webclient flux reactive


    【解决方案1】:

    发现问题,这里是“固定”代码:

    package chatclient;
    
    import io.netty.handler.ssl.SslContext;
    import io.netty.handler.ssl.SslContextBuilder;
    import org.springframework.http.client.reactive.ClientHttpConnector;
    import org.springframework.http.client.reactive.ReactorClientHttpConnector;
    import org.springframework.web.reactive.function.client.WebClient;
    import reactor.core.publisher.Flux;
    import reactor.netty.http.client.HttpClient;
    
    public class SslWebClientTest {
    
        public static void main(String[] args) {
    
            try {
                SslContext sslContext = SslContextBuilder
                        .forClient()
                        .build();
    
                HttpClient httpClient = HttpClient.create().secure(sslContextSpec -> sslContextSpec.sslContext(sslContext));
                ClientHttpConnector httpConnector = new ReactorClientHttpConnector(httpClient);
    
                WebClient webClient = WebClient.builder()
                        .clientConnector(httpConnector)
                        .build();
    
                Flux<String> stringFlux = webClient
                        .get()
                        .uri("https://www.google.com")
                        .retrieve()
                        .bodyToFlux(String.class);
                stringFlux.subscribe(System.out::println);
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    }
    

    需要:

    compile group: 'io.netty', name: 'netty-handler', version: '4.1.51.Final'
    compile group: 'io.projectreactor.netty', name: 'reactor-netty', version: '0.9.11.RELEASE'
    

    webclient 使用 netty,而不是 jetty。然后样本工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-19
      • 1970-01-01
      • 1970-01-01
      • 2016-12-27
      • 2011-09-28
      • 2019-05-16
      • 2021-01-19
      • 2018-01-07
      相关资源
      最近更新 更多