Java Webclient post call在Intellij中从未收到响应

Java Webclient post call在Intellij中从未收到响应,java,intellij-idea,webclient,spring-webclient,Java,Intellij Idea,Webclient,Spring Webclient,我已经在Java应用程序中编写了一个webclient实例。我已经创建了一个ssl上下文,用于我试图访问的服务器,以及基本身份验证。我提出了一个休息后的要求。起初,我怀疑自己是否正确创建了ssl上下文,或者是否错误地添加了基本身份验证。然而,在我看来,我的post请求根本没有到达端点,因为我既不能打印响应正文,也不能打印响应标题或状态代码。这使我认为有一些与我的代码无关的重要内容,可能是某种配置,那就是阻止我的应用程序正确地发送请求并命中端点。下面是我的当前代码 @Configuration

我已经在Java应用程序中编写了一个webclient实例。我已经创建了一个ssl上下文,用于我试图访问的服务器,以及基本身份验证。我提出了一个休息后的要求。起初,我怀疑自己是否正确创建了ssl上下文,或者是否错误地添加了基本身份验证。然而,在我看来,我的post请求根本没有到达端点,因为我既不能打印响应正文,也不能打印响应标题或状态代码。这使我认为有一些与我的代码无关的重要内容,可能是某种配置,那就是阻止我的应用程序正确地发送请求并命中端点。下面是我的当前代码


@Configuration
@SpringBootApplication
public class myApplication {



    public static SslContext getClientSslContext() throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException, UnrecoverableKeyException {
        //log.info("Creating SslContext for webClientBuilder");
        KeyStore trustStore = KeyStore.getInstance("jks");
        trustStore.load(new FileInputStream("myPath"),
                ("myPassword").toCharArray());
        TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        trustManagerFactory.init(trustStore);
        KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        KeyStore keyStore = KeyStore.getInstance("jks");
        keyStore.load(new FileInputStream("myPath"),
                ("myPassword").toCharArray());
        keyManagerFactory.init(keyStore, ("myPassword").toCharArray());
        //log.info("Created SslContext for webClientBuilder");
        return SslContextBuilder.forClient()
                .keyManager(keyManagerFactory)
                .trustManager(trustManagerFactory)
                .build();
    }


    static Mono<ClientResponse> createBackUpRequest() throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException, UnrecoverableKeyException {
        Gson gson = new Gson();
        //JSONObject reqBodyJson = new JSONObject();
        LinkedHashMap<String, Object> reqBody
                = new LinkedHashMap<String, Object>();
        LinkedHashMap<String, String> variables
                = new LinkedHashMap<String, String>();


        reqBody.put("variables", variables);

        System.out.println(gson.toJson(reqBody));

        SslContext sslContext = getClientSslContext();
        HttpClient httpClient = HttpClient.create().secure(sslSpec -> sslSpec.sslContext(sslContext));

        WebClient webClient = WebClient.builder()
                .clientConnector(new ReactorClientHttpConnector(httpClient))
                //.baseUrl("host")
                .defaultHeaders(HttpHeaders -> HttpHeaders.setBasicAuth("myUser", "myPassword"))
                .defaultHeader(HttpHeaders.USER_AGENT, "Spring 5 WebClient")
                .defaultHeader(HttpHeaders.ACCEPT, "application/json")
                .defaultHeader(HttpHeaders.CONTENT_TYPE, "application/json")
                .build();

        return webClient.post()
                .uri("host")
                .body(Mono.just(reqBody), LinkedHashMap.class)//if directly putting the map doesn't work
                .exchange()
                .doOnSuccess(clientResponse -> System.out.println("clientResponse.headers() = " + clientResponse.headers()))
                .doOnSuccess(clientResponse -> System.out.println("clientResponse.statusCode() = " + clientResponse.statusCode()));
    }




    public static void main(String[] args) throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException, UnrecoverableKeyException {
        SpringApplication.run(QaAutomatedBackupApplication.class, args);
        System.out.println("print out");
        createBackUpRequest();
        System.out.println("second print out");
    }
}



@配置
@SpringBoot应用程序
公共类myApplication{
public static SslContext getClientSslContext()抛出KeyStoreException、IOException、nosuchagorithmexception、certificateeexception、unrecoverablekeyeexception{
//log.info(“为WebClient Builder创建SslContext”);
keystoretruststore=KeyStore.getInstance(“jks”);
load(新文件输入流(“myPath”),
(“myPassword”).toCharArray();
TrustManagerFactory TrustManagerFactory=TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
init(信任库);
KeyManagerFactory KeyManagerFactory=KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
KeyStore KeyStore=KeyStore.getInstance(“jks”);
加载(新文件输入流(“myPath”),
(“myPassword”).toCharArray();
keyManagerFactory.init(keyStore,(“myPassword”).toCharArray();
//log.info(“为WebClient Builder创建了SslContext”);
返回SslContextBuilder.forClient()
.keyManager(keyManagerFactory)
.trustManager(trustManagerFactory)
.build();
}
静态Mono createBackUpRequest()抛出KeyStoreException、IOException、NoSuchAlgorithmException、CertificateException、UnrecoverableKeyException{
Gson Gson=新的Gson();
//JSONObject reqBodyJson=新的JSONObject();
LinkedHashMapReqBody
=新LinkedHashMap();
LinkedHashMap变量
=新LinkedHashMap();
reqBody.put(“变量”,变量);
System.out.println(gson.toJson(reqBody));
SslContext SslContext=getClientSslContext();
HttpClient HttpClient=HttpClient.create().secure(sslSpec->sslSpec.sslContext(sslContext));
WebClient WebClient=WebClient.builder()
.clientConnector(新的ReactorClientHttpConnector(httpClient))
//.baseUrl(“主机”)
.defaultHeaders(HttpHeaders->HttpHeaders.setBasicAuth(“myUser”、“myPassword”))
.defaultHeader(HttpHeaders.USER\u代理,“Spring5WebClient”)
.defaultHeader(HttpHeaders.ACCEPT,“应用程序/json”)
.defaultHeader(HttpHeaders.CONTENT_类型,“应用程序/json”)
.build();
返回webClient.post()
.uri(“主机”)
.body(Mono.just(reqBody),LinkedHashMap.class)//如果直接放置映射不起作用
.exchange()
.doOnSuccess(clientResponse->System.out.println(“clientResponse.headers()=”+clientResponse.headers()))
.doOnSuccess(clientResponse->System.out.println(“clientResponse.statusCode()=”+clientResponse.statusCode());
}
publicstaticvoidmain(字符串[]args)抛出KeyStoreException、IOException、nosuchagorithmexception、certificateeexception、unrecoverablekeyeexception{
run(QaAutomatedBackupApplication.class,args);
System.out.println(“打印输出”);
createBackUpRequest();
System.out.println(“第二次打印”);
}
}

问题是您从未订阅反应流

在你订阅之前什么都不会发生。您在
createBackUpRequest
中所做的是为如何获取
ClientResponse
数据建立一个计划(
Mono

将主要方法更改为

    public static void main(String[] args) throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException, UnrecoverableKeyException {
        SpringApplication.run(QaAutomatedBackupApplication.class, args);
        System.out.println("print out");
        createBackUpRequest().subscribe(response -> 
            System.out.println("second print out")
        );
    }
然后它将实际发出web请求。否则,该计划将永远无法执行。 请记住,如果您的SpringBoot应用程序不是SpringWeb应用程序(它将继续在其他线程上运行,侦听Web请求),它将在等待流完成之前立即退出

如果是这种情况,并且您只想进行测试和实验,那么您可以在最后放置一个
线程.sleep(10000)
,这样它就有时间在应用程序关闭之前执行web请求。但很明显,这不是一个好的现实世界实现。

需要得到帮助。