users@jersey.java.net

Re: [Jersey] XmlJavaTypeAdapter and jersey

From: Paul Sandoz <Paul.Sandoz_at_oracle.com>
Date: Wed, 11 Aug 2010 11:26:08 +0200

Hi Christopher,

Have you verified that you can use marshall ImmutableSausage using
stand alone JAXB?

I did a quick test and it is not possible to marshall an instance of
ImmutableSausage. You will get an exception like the following:

Exception in thread "main"
com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1
counts of IllegalAnnotationExceptions
Main$ImmutableSausage does not have a no-arg default constructor.
         this problem is related to the following location:
                 at Main$ImmutableSausage

if you try:

        JAXBContext c =
JAXBContext.newInstance(ImmutableSausage.class, SausageBean.class);
         StringWriter sw = new StringWriter();
         c.createMarshaller().marshal(new ImmutableSausage(1), sw);

or:

Exception in thread "main" javax.xml.bind.JAXBException: class Main
$ImmutableSausage nor any of its super class is known to this context.

if you try:

         JAXBContext c = JAXBContext.newInstance(SausageBean.class);
         StringWriter sw = new StringWriter();
         c.createMarshaller().marshal(new ImmutableSausage(1), sw);

Thus i don't think you can use the XmlAdapter to transform to/from an
XML root element.

In this case you will need to write your own message body writer for
ImmutableSausage.

Paul.

On Aug 10, 2010, at 9:01 PM, Christopher Piggott wrote:

> Hi,
>
> I understand about messagebodywriters but I'm trying to figure out a
> way for this to happen more automatically. Here's the situation:
>
> I have an object that's not a true POJO in the sense that it has no
> default constructor and it's immutable, e.g.:
>
> public class ImmutableSausage {
> final int bites;
> public ImmutableSausage(int numBites) { bites = numBites; }
> public int getBites() { return bites; }
> }
>
> I haven't totally figured out this works, but I gather that to
> serialize this I make:
>
> @XmlElement
> @XmlJavaTypeAdapter(SausageAdapter.class)
> public class SausageBean {
> int bites;
> public void setBites( int numBites) { bites = numBites; }
> @XmlAttribute
> public int getBites() { return bites; }
> }
>
> then I create a SausageAdapter implements XmlAdapter<SausageBean,
> ImmutableSausage>
>
> (this is where I get to the jersey part)
>
> @GET
> @Produces("application/xml")
> ImmutableSausage getSausage()
> {
> return new ImmutableSausage(12);
> }
>
>
> so, my resource method returns something that is not at all a bean,
> but 1. jaxb knows what to do with it because of the
> XmlJavaTypeAdapter 2. it's all handled by jaxb so that I don't need
> MessageBodyReaders or MessageBodyWriters
>
> Do I understand this correctly, and should it work?
>
> --C
>
>