web-dev-qa-db-fra.com

Exception «déjà connecté» essayant de faire POST à l'aide de l'API client Jersey

Je crée des tests d'intégration pour un service Web JAX-RS/Jersey déployé sur Tomcat 8 en utilisant arquillian.

J'essaie de faire une demande POST comme ça:

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));

Quand je fais cela, j'obtiens cette exception:

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

Je pourrais utiliser de l'heuristique depuis j'apprends toujours l'API client arquillian et Jersey :) Merci

17

Il se peut que Java.lang.IllegalStateException: Already connected masque uniquement le SSLHandshakeException. Veuillez jeter un œil au problème # 30 (anciennement JERSEY-2728 bug).

25
G. Demecki

Cela peut être dû à un problème de connexion réseau. J'ai rencontré ce problème depuis que mon VPN a perdu la connexion. Exceptions avec "Already connected "signalé lors de la sérialisation jackson du corps du courrier. (J'ai importé le code source de Jersey et jackson-jaxrs-base pour le débogage). Après avoir supprimé le corps du courrier, puis nouvelle exception avec erreur," Unknown hostname", sortit de.

Après avoir ouvert une session sur mon VPN, tout fonctionne bien.

Je suis très mécontent de l'exception du client Jersey "Already connected "ce qui ne m'a donné que de la confusion.

4
Hao Ma

Vous pouvez définir la propriété d'en-tête sur la connexion http après avoir appelé connection.connect ();

2
Manoj

Le problème vient probablement de la négociation SSL. Essayez d'ajouter la logique d'initialisation du client "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();
2
Dremore