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