cxf-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Sergey Beryozkin (JIRA)" <j...@apache.org>
Subject [jira] Resolved: (CXF-1928) "@Produces", "@Consumes" in JSONProvider
Date Wed, 10 Dec 2008 16:34:44 GMT

     [ https://issues.apache.org/jira/browse/CXF-1928?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]

Sergey Beryozkin resolved CXF-1928.
-----------------------------------

       Resolution: Fixed
    Fix Version/s: 2.2
                   2.1.4

It's now possible to overwrite from Spring the produce or consume types for a given provider

> "@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
>            Assignee: Sergey Beryozkin
>            Priority: Minor
>             Fix For: 2.1.4, 2.2
>
>         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.


Mime
View raw message