[ 
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.

Reply via email to