[ 
https://issues.apache.org/jira/browse/CXF-1928?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12651733#action_12651733
 ] 

Pedro Ballesteros commented on CXF-1928:
----------------------------------------

Now, I reckon there isn't any wrong in JSONProvider. JAX-RS specification tells 
that Provider classes are used with @Provider annotation to associate global 
mime type translation to objetcs. Providers are responsible of translating 
entities. 

So when you defines a new Provider you must associate that provider with a mime 
type. And JSONProvider is just doing that.

But I think that the issue is related with Providers in Libraries. 

The library assign a mime type, but maybe the developer wants to reuse that 
clases with other mime types. So that classes must not be final classes, 
because if you want to use other annotations I think the only way is 
subclassing.

Anyway, my mistake is related with CXF or its integration with Spring, because 
you can't use @Provider annotation, and you have to inject the Provider with 
the service beans, and in this case the Provider isn't global as in 
specifications.


> "@Produces", "@Consumes"  in JSONProvider
> -----------------------------------------
>
>                 Key: CXF-1928
>                 URL: https://issues.apache.org/jira/browse/CXF-1928
>             Project: CXF
>          Issue Type: Improvement
>          Components: REST
>    Affects Versions: 2.1.3
>         Environment: Tomcat 6.0.18, Spring 2.5
>            Reporter: Pedro Ballesteros
>            Priority: Minor
>         Attachments: ReplyJSONWithOtherMimes.txt
>
>
> When you use JSONProvider your services only can work with Content-Type 
> "application/json". If you configure another Content-Type in your services, 
> JSONProvicer doesn't process the request and doesn't do XML-JSON 
> transformations.
> I know it isn't right to use another Content-Type with JSON Responses, but I 
> think it should be developer decision.
> You might need to use "text/plain", "text/json", even if it isn't completely 
> right. For example, I'm doing a public REST API, and I'd like  it to be 
> robust and support several Content-Types, like "json/text", 
> "json/application", "text/plain". 
> But JSON Provider only works with "json/application".
> The problem is JSONProvider "@Produce" and "@Consumes" annotations:
> @Produces("application/json")
> @Consumes("application/json")
> @Provider
> public final class JSONProvider extends AbstractJAXBProvider  { ... }
> And you can't use inheritance to override class Annotations because 
> JSONProvider class is final.
> I think it should be this way:
> @Produces("*/*")
> @Consumes("*/*")
> @Provider
> public final class JSONProvider extends AbstractJAXBProvider  { ... }
> This way developers can choose "@Produces" and "@Consumers" annotation 
> service Beans.
> Ej:
> When you don't use JSONProvider the behavior is like this:
> @GET
> @ProduceMime("text/plain" )
> public ContactEntry  get() { ... }
> It produces XML if you are using JAXB. (It isn't probably good thing to 
> response XML as text/plain content type, I know, but the important thing is 
> that I can.
> @GET
> @ProduceMime("text/xml" )
> public ContactEntry  get() { ... }
> It produces XML too. (That's better, to use XML with text/xml content type).
> So you can choose the content type when you aren't using JSONProvider, even 
> if  you are using wrong content types.
> But if you use JSONProvider:
> <bean id="jsonProvider" class="org.apache.cxf.jaxrs.provider.JSONProvider"/>
> <jaxrs:server id="contactsRemoteService" address="/">
>         <jaxrs:serviceBeans>
>             <ref bean="contactsService" />
>         </jaxrs:serviceBeans>
>         <jaxrs:providers>
>             <ref bean="jsonProvider" />
>         </jaxrs:providers>
> </jaxrs:server>
> With: 
> @GET
> @ProduceMime("text/plain" )
> public ContactEntry  get() { ... }
> or
> @GET
> @ProduceMime("text/json" )
> public ContactEntry  get() { ... }
> The service produces XML, even though you are using the JSONProvider, but:
> @GET
> @ProduceMime("json/application" )
> public ContactEntry  get() { ... }
> It produces JSON.
> But you probably might need to configure your service with several 
> content-types, like "text/json", "json/application", etc. But you can't with 
> JSONProvider. And it is a final class, so you can't override Annotations with 
> inheritance. 
> So if you use this:
> @GET
> @ProduceMime({"text/json", "json/application"})
> @ConsumeMime({"text/json", "json/application"})
> public ContactEntry  get() { ... }
> The bean response JSON with json/application content types, but XML with 
> text/json content-type.
> You can use a delegation design pattern (I suppose there are better 
> solutions): See attach file.
> Best Regards,
>      Pedro

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