[ https://issues.apache.org/jira/browse/CXF-2070?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12676943#action_12676943 ]
Sergey Beryozkin commented on CXF-2070: --------------------------------------- thanks for raising the issue - It was fixed yesterday - fix will be available in 2.1.5 too. I'll close it after doing few more tests... > CXF2.1.4 Content Negotiation > ---------------------------- > > Key: CXF-2070 > URL: https://issues.apache.org/jira/browse/CXF-2070 > Project: CXF > Issue Type: Bug > Components: Resources, REST > Affects Versions: 2.1.4 > Environment: CXF2.1.4 > Reporter: 梁凯 > Fix For: 2.1.4 > > > According to the JAX-RS311 specification(Jun 27,2008 0.9version), section > 3.8 Determining the MediaType of Responses > 4. Sort A and P in descending order, each with a primary key of q-value > and secondary key of specificity 8 > (n/m > n/* > */*). > > that means types with higher quality value should be more specific than types > with lower quality value, but in CXF2.1.4 implementation. > public final class JAXRSUtils { > ... > public static int compareMediaTypes(MediaType mt1, MediaType mt2) { > > if (mt1.equals(mt2)) { > float q1 = > getMediaTypeQualityFactor(mt1.getParameters().get("q")); > float q2 = > getMediaTypeQualityFactor(mt2.getParameters().get("q")); > int result = Float.compare(q1, q2); > return result == 0 ? result : ~result; > } > > if (mt1.isWildcardType() && !mt2.isWildcardType()) { > return 1; > } > if (!mt1.isWildcardType() && mt2.isWildcardType()) { > return -1; > } > > if (mt1.getType().equals(mt2.getType())) { > if (mt1.isWildcardSubtype() && !mt2.isWildcardSubtype()) { > return 1; > } > if (!mt1.isWildcardSubtype() && mt2.isWildcardSubtype()) { > return -1; > } > } > return mt1.toString().compareTo(mt2.toString()); > > } > ... > } > The content-negotiation algorithm of CXF2.1.4 seems to take quality value > into account only when comparing equivalent MediaTypes. > As a result, for the @ProduceMime{ "application/xml;q=0.9", > "application/json;q=0.5" }, the "application/json;q=0.5" is preferred, which > does not respect the JAX-RS311 specification. > So, I suggest change the compareMediaTypes method as follows to meet the > JAX-RS311 specification. > public static int compareMediaTypes(MediaType mt1, MediaType mt2) { > float q1 = getMediaTypeQualityFactor(mt1.getParameters().get("q")); > float q2 = getMediaTypeQualityFactor(mt2.getParameters().get("q")); > int result = Float.compare(q1, q2); > if (result != 0) > return ~result; > > if (mt1.isWildcardType() && !mt2.isWildcardType()) { > return 1; > } > if (!mt1.isWildcardType() && mt2.isWildcardType()) { > return -1; > } > > if (mt1.getType().equals(mt2.getType())) { > if (mt1.isWildcardSubtype() && !mt2.isWildcardSubtype()) { > return 1; > } > if (!mt1.isWildcardSubtype() && mt2.isWildcardSubtype()) { > return -1; > } > } > return mt1.toString().compareTo(mt2.toString()); > } -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.