Hi KL On 31/01/12 02:26, K Fung wrote:
Hi Stephan,(this e-mail is based off revision 14 of your source code, da71e69dfdcd) I have some good news and bad news. The good news is that I have a workaround that can make all of your parameterized tests pass. The bad news is that CXF and Jersey binaries are indeed getting mixed up when you run these tests. For the workaround, In JerseyTestClient, change your getResource method so that it looks like the following: public String getResource(URI uri) { JerseyTestClient.LOGGER.debug("getResource(), uri = " + uri); WebResource webResource = new Client().resource(uri); return webResource.accept(MediaType.WILDCARD_TYPE).get(String.class); } By sending an explicit Accept header, this will block HttpUrlConnection from sending an invalid header to CXF. CXF was (correctly!) spitting out a 406 when the HttpUrlConnection was sending: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
is it a single '*' which causes CXF to reply with 406 ? May be CXF should be more tolerable to single "*" which I guess is a legacy wildcard value...I think it should.
thanks for the analysis Sergey
(I'm not sure why HttpUrlConnection was sending this invalid accept. I didn't drill down into this too deeply. Perhaps the JDK team can tell us why). This would obviously imply that your test clients should always be sending an Accept header but this shouldn't be too much of a burden for you (and it seems you've already done it in the latest version of CxfTestClient). Nevertheless, as I feared, CXF and Jersey code are getting mixed up on the server-side. You can see this in the stack: 012-01-30 17:40:18,785 DEBUG [qtp525030058-29] org.apache.cxf.phase.PhaseInterceptorChain: Invoking handleMessage on interceptor org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor@1ff61bcf java.lang.IllegalArgumentException: Error parsing media type '*; q=.2' at com.sun.jersey.core.impl.provider.header.MediaTypeProvider.fromString(MediaTypeProvider.java:77) at com.sun.jersey.core.impl.provider.header.MediaTypeProvider.fromString(MediaTypeProvider.java:50) at javax.ws.rs.core.MediaType.valueOf(MediaType.java:119) at org.apache.cxf.jaxrs.utils.JAXRSUtils.parseMediaTypes(JAXRSUtils.java:1097) at org.apache.cxf.jaxrs.utils.JAXRSUtils.sortMediaTypes(JAXRSUtils.java:1189) at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:136) at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java:88) at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263) at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:123) at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:206) at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:213) at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:154) at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:126) at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:184) at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doGet(AbstractHTTPServlet.java:112) at javax.servlet.http.HttpServlet.service(HttpServlet.java:693) at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:163) at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:538) at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:478) at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:225) at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:940) at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:406) at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:186) at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:874) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117) at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:149) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:110) at org.eclipse.jetty.server.Server.handle(Server.java:349) at org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:441) at org.eclipse.jetty.server.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:919) at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:582) at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:218) at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:52) at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:586) at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:44) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:598) at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:533) at java.lang.Thread.run(Thread.java:662) Caused by: java.text.ParseException: Expected separator '/' instead of ';' at com.sun.jersey.core.header.reader.HttpHeaderReader.nextSeparator(HttpHeaderReader.java:112) at com.sun.jersey.core.impl.provider.header.MediaTypeProvider.valueOf(MediaTypeProvider.java:88) at com.sun.jersey.core.impl.provider.header.MediaTypeProvider.fromString(MediaTypeProvider.java:75) ... 37 more Regards, kl P.S. I assume you deliberately wanted a Jersey client to connect to a CXF server.
