cxf-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Pedro Ballesteros (JIRA)" <>
Subject [jira] Commented: (CXF-1928) "@Produces", "@Consumes" in JSONProvider
Date Sat, 29 Nov 2008 17:22:44 GMT


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:
>             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
> Best Regards,
>      Pedro

This message is automatically generated by JIRA.
You can reply to this email to add a comment to the issue online.

View raw message