users@jersey.java.net

[Jersey] Re: JAXB _at_XmlSeeAlso supported in Jersey?

From: Arul Dhesiaseelan <aruld_at_acm.org>
Date: Tue, 8 Nov 2011 11:54:31 -0700

Hi Jakub,

Sure. I abstracted out a simple project (basically a CXF JAXWS sample) that
shows interfaces works with JAXB adapters.

Attaching it as a maven project. Run the Server and run the Client code and
it should work just fine.

Do you think this can be supported in Jersey? I can log an enhancement
request with a similar JAX-RS sample.

Let me know.

Thanks!
Arul

On Tue, Nov 8, 2011 at 10:48 AM, Jakub Podlesak
<jakub.podlesak_at_oracle.com>wrote:

> Hi Arul,
>
> this is currently not supported as Jersey only
> recognizes @XmlRootElement or @XmlType annotated types
> as the types to be processed by the JAXB entity providers.
> If JAXB supports your scenario (i mean unmarshaling a concrete
> implementation when i ask for the interface) out of the box,
> it should be quite easy to add this feature. Could you please
> confirm that this is the case?
>
> Then also, would you be so kind, file a new RFE (at [1]) and attach a
> simple
> project, which we could use as a test case for the expected behavior?
>
> That should help us to bring this feature for you.
>
> Thanks,
>
> ~Jakub
>
> [1]http://java.net/jira/**browse/JERSEY<http://java.net/jira/browse/JERSEY>
>
>
> On 8.11.2011 18:37, Arul Dhesiaseelan wrote:
>
>> I have the following resource methods:
>>
>> @POST
>> @Path("join")
>> @Consumes(MediaType.**APPLICATION_XML)
>> public void processJoinNotificationFromPee**r(JoiningNotification
>> notification) {
>> notifications.add(**notification);
>> }
>>
>> @POST
>> @Path("leave")
>> @Consumes(MediaType.**APPLICATION_XML)
>> public void processLeaveNotificationFromPe**er(LeavingNotification
>> notification) {
>> notifications.add(**notification);
>> }
>>
>> private final List<PeerNotification> notifications = new
>> ArrayList<PeerNotification>();
>>
>> Ideally, I would like to merge these two methods into one:
>>
>> @POST
>> @Path("notify")
>> @Consumes(MediaType.**APPLICATION_XML)
>> public void processNotificationFromPeer(**PeerNotification
>> notification) {
>> notifications.add(**notification);
>> }
>>
>> But, this does not work because PeerNotification is an interface. I have
>> annotated the interface as shown below:
>>
>> @XmlSeeAlso({**JoiningNotification.class, LeavingNotification.class})
>> public interface PeerNotification {
>> Peer getPeer();
>> }
>>
>> This is supposed to bind the implementations at JAXB runtime, but looks
>> like this does not work. Is this supported in Jersey?
>>
>> Also, I have a generic API which returns List of PeerNotifications, but
>> this also suffers from the same problem.
>>
>> @GET
>> @Path("notifications")
>> @Produces(MediaType.**APPLICATION_XML)
>> public List<PeerNotification> getNotifications() {
>> return notifications;
>> }
>>
>>
>> SEVERE: A message body writer for Java class java.util.ArrayList, and
>> Java type java.util.List<fluximpl.**cluster.events.**PeerNotification>,
>> and MIME media type application/xml was not found
>> Nov 8, 2011 10:26:21 AM com.sun.jersey.spi.container.**ContainerResponse
>> write
>> SEVERE: The registered message body writers compatible with the MIME
>> media type are:
>> application/xml ->
>> com.sun.jersey.core.impl.**provider.entity.**XMLJAXBElementProvider$App
>> com.sun.jersey.core.impl.**provider.entity.**DocumentProvider
>> com.sun.jersey.core.impl.**provider.entity.**SourceProvider$SourceWriter
>> com.sun.jersey.core.impl.**provider.entity.**XMLRootElementProvider$App
>> com.sun.jersey.core.impl.**provider.entity.**XMLListElementProvider$App
>> */* ->
>> com.sun.jersey.core.impl.**provider.entity.FormProvider
>> com.sun.jersey.server.impl.**template.**ViewableMessageBodyWriter
>> com.sun.jersey.core.impl.**provider.entity.StringProvider
>> com.sun.jersey.core.impl.**provider.entity.**ByteArrayProvider
>> com.sun.jersey.core.impl.**provider.entity.FileProvider
>> com.sun.jersey.core.impl.**provider.entity.**InputStreamProvider
>> com.sun.jersey.core.impl.**provider.entity.**DataSourceProvider
>> com.sun.jersey.core.impl.**provider.entity.**
>> XMLJAXBElementProvider$General
>> com.sun.jersey.core.impl.**provider.entity.ReaderProvider
>> com.sun.jersey.core.impl.**provider.entity.**DocumentProvider
>> com.sun.jersey.core.impl.**provider.entity.**StreamingOutputProvider
>> com.sun.jersey.core.impl.**provider.entity.**SourceProvider$SourceWriter
>> com.sun.jersey.core.impl.**provider.entity.**
>> XMLRootElementProvider$General
>> com.sun.jersey.core.impl.**provider.entity.**
>> XMLListElementProvider$General
>>
>>
>> I have tried few other things using XmlAdapter, but none of them work.
>> Sounds like, this is supported in Resteasy (http://209.132.183.68/docs/**
>> en-US/JBoss_Enterprise_Web_**Platform/5/html/RESTEasy_**
>> Reference_Guide/JAXB_**INTERFACES.html<http://209.132.183.68/docs/en-US/JBoss_Enterprise_Web_Platform/5/html/RESTEasy_Reference_Guide/JAXB_INTERFACES.html>
>> ).
>>
>> Am I missing anything here? I am using Jersey 1.10. Appreciate your
>> suggestions.
>>
>> Thanks!
>> Arul
>>
>


-- 
http://aruld.info
http://twitter.com/aruld