I'm creating integration tests for a JAX-RS/Jersey Webservice deployed on Tomcat 8 using arquillian.
I am trying to do a POST request like that:
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)); When I do that I get this exception:
Caused by: java.lang.IllegalStateException: Already connected at sun.net.(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 I could use some heuristic since I am still learning arquillian and Jersey client API :) Thank you
15 Answers
It may be that java.lang.IllegalStateException: Already connected only masks the SSLHandshakeException. Please take a look at the issue #3000 (previously known as JERSEY-2728 bug).
This could be due to network connection problem. I met this problem since my VPN lost connection. Exceptions with "Already connected" reported during jackson serializing the mail body.(I imported the source code of Jersey and jackson-jaxrs-base for debugging). After I removed the mail body, then new Exception with error, "Unknown hostname", came out.
After I login to my VPN, everything works fine.
I am very unhappy about the Jersey client exception "Already connected" which gave me nothing but confusion.
Probably the problem is in SSL negotiation. Try to add "trustall" Client initialization logic.
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(); 3You may be setting header property on http connection after calling connection.connect();
1Its probably an SSL exception being masked by the already connected exception. The easiest way to verify/debug the SSL exception is to add the following JVM flags:
-Djavax.net.debug=ssl:handshake:verbose:keymanager:trustmanager -Djava.security.debug=access:stack This will tell the JVM to print out a whole host of SSL handshake information including any exceptions. From this information you should be able to see what the problem is.