I think before CXF was sorting Accept values alphabetically, and it was
a coincidence that you had XML prioritized. In 3.0.0 it is all very
strictly per the spec, if you have text/html coming first, no Produces,
text/html would be selected as the response Content-Type...
Cheers, Sergey
On 09/01/15 13:59, Unico Hommes wrote:
Hi Sergey,
On Thu, Jan 8, 2015 at 7:51 PM, Sergey Beryozkin <[email protected]> wrote:
Hi
The response content type is determined early now when a resource method is
selected and it is the intersection between Accept and @Produces
Thanks for the pointer, my services were missing the @Produces
annotation, adding them fixes the issue.
Still, since the default value of the @Produces annotation is */* and
the specification explicitly states that "In the absence of
either of these annotations [@Consumes, @Produces], support for any
media type (“*/*”) is assumed" shouldn't that match an Accept header
of text/html,application/xhtml+xml,application/xml? To be clear,
explicitly adding an empty @Produces annotation, or @Produces({*/*})
help neither, only exact matches work: @Produces({"application/xml",
"application/json"}. The star simply seems to be interpreted as a
string literal instead of a wild card.
--
Unico
Perhaps you need to introduce some qs qualifiers to make the intersection
more deterministic ?
Can you provide more info please ? The method signature, the actual Accept
value (with all the 'q' qualifiers) ?
Thanks, Sergey
On 08/01/15 18:06, Unico Hommes wrote:
I have been upgrading my application from CXF 2.6 to 3.0 and
encountered a difference to the way JAXRSOutInterceptor selects a
WriterInterceptor to serialize a message based on the Accept header.
It used to be that if you sent a request with an Accept header of
text/html,application/xhtml+xml,application/xml (like a regular
browser does), a WriterInterceptor would be selected based on that [1]
if no Content-Type header was sent along. But in 3.0 this is no longer
the case, only the Content-Type header is used [2]. The problem is
that when I now want to browse my REST service I get a server error
instead of the xml output I was expecting. This is because my browser
does not send a Content-Type header but only an Accept header. Was
this a change required by the spec or is this a bug?
Regards,
Unico
1.
http://grepcode.com/file/repo1.maven.org/maven2/org.apache.cxf/cxf-bundle/2.6.16/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java#JAXRSOutInterceptor.computeAvailableContentTypes%28org.apache.cxf.message.Message%2Cjavax.ws.rs.core.Response%29
2.
http://grepcode.com/file/repo1.maven.org/maven2/org.apache.cxf/cxf-rt-frontend-jaxrs/3.0.2/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java#213