Исключение "Уже подключено", пытающееся выполнить запрос POST с использованием API-интерфейса клиента клиента

Я создаю интеграционные тесты для JAX-RS/Jersey Webservice, развернутого на Tomcat 8 с использованием arquillian.

Я пытаюсь сделать запрос POST следующим образом:

E dummy = dummyFactory.manufacturePojo(getSubClassType());
dummy.setId(null);

Client client = ClientBuilder.newClient();
WebTarget target = client.target(BASE_URI).path("bandeira");

Response response = target.request(MediaType.APPLICATION_JSON)
            .header(HttpHeaders.AUTHORIZATION, CHAVE_TESTE)
            .header(HttpHeaders.CONTENT_TYPE, "application/json")
            .post(Entity.entity(dummy, MediaType.APPLICATION_JSON));

Когда я делаю это, я получаю это исключение:

Caused by: java.lang.IllegalStateException: Already connected
at sun.net.www.protocol.http.HttpURLConnection.setRequestProperty(HttpURLConnection.java:3000)
at org.glassfish.jersey.client.HttpUrlConnector.setOutboundHeaders(HttpUrlConnector.java:364)
at org.glassfish.jersey.client.HttpUrlConnector.access$100(HttpUrlConnector.java:91)
at org.glassfish.jersey.client.HttpUrlConnector$4.getOutputStream(HttpUrlConnector.java:327)
at org.glassfish.jersey.message.internal.CommittingOutputStream.commitStream(CommittingOutputStream.java:201)
at org.glassfish.jersey.message.internal.CommittingOutputStream.commitStream(CommittingOutputStream.java:195)
at org.glassfish.jersey.message.internal.CommittingOutputStream.commit(CommittingOutputStream.java:263)
at org.glassfish.jersey.message.internal.OutboundMessageContext.commitStream(OutboundMessageContext.java:816)
at org.glassfish.jersey.client.ClientRequest.writeEntity(ClientRequest.java:546)
at org.glassfish.jersey.client.HttpUrlConnector._apply(HttpUrlConnector.java:331)
at org.glassfish.jersey.client.HttpUrlConnector.apply(HttpUrlConnector.java:243)
at org.glassfish.jersey.client.ClientRuntime.invoke(ClientRuntime.java:246)
... 149 more

Я мог бы использовать некоторую эвристику, так как я все еще изучаю API-интерфейс arquillian и Jersey client:) Спасибо вам

Ответ 1

Может быть, java.lang.IllegalStateException: Already connected маскирует только SSLHandshakeException. Пожалуйста, взгляните на вопрос # 3000 (ранее известный как JERSEY-2728).

Ответ 2

Вероятно, проблема заключается в согласовании SSL. Попробуйте добавить логику инициализации клиента "trustall".

SSLContext sslcontext = SSLContext.getInstance("TLS");
sslcontext.init(null, new TrustManager[] { new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}

@Override
public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}

@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}

} }, new java.security.SecureRandom());

Client client = ClientBuilder.newBuilder().sslContext(sslcontext).hostnameVerifier((s1, s2) -> true)
.register(MultiPartFeature.class)
.register(new EncodingFeature("gzip", GZipEncoder.class))
.build();

Ответ 3

Это может быть связано с проблемой сетевого подключения. Я столкнулся с этой проблемой, так как мое VPN потеряло соединение. Исключения с "Already connected", которые были указаны во время сериализации почтового ящика джексоном (я импортировал исходный код Джерси и Jackson-jaxrs-base для отладки). После того как я удалил тело письма, вышло новое исключение с ошибкой "Unknown hostname".

После входа в мою VPN все работает нормально.

Я очень недоволен исключительным клиентом в Джерси "Already connected, который не дал мне ничего, кроме путаницы.

Ответ 4

Вы можете настроить свойство заголовка в http-соединении после вызова connection.connect();