Even more interestingly - how do we fix it? :)
On Jan 30, 2012, at 7:26 PM, 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
>
> (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.