cxf-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Sergey Beryozkin (JIRA)" <>
Subject [jira] [Commented] (CXF-6307) Wrong select the message body reader
Date Mon, 20 Apr 2015 14:01:58 GMT


Sergey Beryozkin commented on CXF-6307:

If we talk about message body writers - the custom matching providers always selected in preference
to the default ones, media types are checked next.
It is a bit unfortunate the sorting is different for readers (media types first, the custom
vs pre-packaged next).
However if we take the static vs dynamic media type consideration into account, the actual
CXF implementation is actually more optimized.

But as I've said - we will get this issue resolved properly and your effort is appreciated.
Please give it a try with a challenge. Once we know what the challenge result is we will discuss
what to do next. If the challenge fails: I will obviously refactor and take your code as an
input. If the challenge gets accepted: we will discuss if we want to do the refactoring at

Thanks again !

> Wrong select the message body reader
> ------------------------------------
>                 Key: CXF-6307
>                 URL:
>             Project: CXF
>          Issue Type: Bug
>          Components: JAX-RS
>    Affects Versions: 3.0.3
>         Environment: Windows
>            Reporter: Neal Hu
>             Fix For: 3.0.5
> This is a CTS testcase, the resource class is like this:   
>    @POST
>     @Path("boolean")
>     public Boolean postBoolean(Boolean bool) {
>     	if(bool){    		 
>     		throw new WebApplicationException(Status.NOT_ACCEPTABLE);
>     	}
>         return false;
>     }
> The application provided provider is like this:
> public class MyReader implements MessageBodyReader<Boolean> {
>     @Override
>     public boolean isReadable(Class<?> type, Type type1, Annotation[] antns, MediaType
mt) {
>     	return type== Boolean.class;
>     }
>     @Override
>     public Object readFrom(Class<Object > type,
>                              Type type1,
>                              Annotation[] antns,
>                              MediaType mt, MultivaluedMap<String, String> mm,
>                              InputStream in) throws IOException, WebApplicationException
> 		return Boolean.valueOf("true");        
>     }
> }
> The request
> Content-Type:text/plain
> Accept:text/plain 
> Method:POST
> Body:false
> According to jsr339 section 4.2.4 Standard Entity Providers java.lang.Boolean, java.lang.Character,
java.lang.Number Only for text/plain. Corresponding primitive types supported via boxing/unboxing
> An implementation MUST support application-provided entity providers and MUST use those
in preference to its own pre-packaged providers when either could handle the same request.
More precisely, step 4 in Section 4.2.1 and step 5 in Section 4.2.2 MUST prefer application-provided
over pre-packaged entity providers.
> 4.2.1 Message Body Reader
> 3. Select the set of MessageBodyReader classes that support the media type of the request,
see Section
> 4.2.3.
> 4. Iterate through the selected MessageBodyReader classes and, utilizing the isReadable
method of
> each, choose a MessageBodyReader provider that supports the desired Java type.
> It says the entity providers should be sorted by media type firstly then(the media type
is the same) on Section 4.2.1 and step 5 in Section 4.2.2 MUST prefer application-provided
over pre-packaged entity providers. So org.apache.cxf.jaxrs.provider.PrimitiveTextProvider
should be selected as its media type MUST be text/plain and the application provider's media
type is */*.(x/y>x/*>*/*)
> So at this point the CTS expected response code is 200 instead of 406, the application
provided provider should not be chosen.

This message was sent by Atlassian JIRA

View raw message