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
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).
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.
Vous pouvez définir la propriété d'en-tête sur la connexion http après avoir appelé connection.connect ();
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();