Tuesday, February 28, 2012

How do i write objects that i have no control over in jaxb?


I am trying to find a way to marshall classes that i have no access to. I am trying to achieve something like this:




@XmlRootElement(name="bar")
class Bar {
@XmlAttribute
private Foo foo;

@XmlAttribute
private String baz;
}



which should result in a xml file like this:




<bar baz="stuff" foo="otherstuff"/>



Is this possible? I tried to fiddle with @XmlJavaTypeAdapter with no sucess.

2 comments:

  1. If you do not have access to the classes used to generate an XML file, but you do have access to the schema based on/used to generate those classes, you should be able to re-generate those classes using xjc and the schema definition (xsd) file.

    ReplyDelete
  2. You're on the right track with XmlJavaTypeAdapter, but I suspect foo needs to be an XmlElement rather than an XmlAttribute:

    @XmlRootElement(name="bar")
    public class Bar {

    @XmlElement
    @XmlJavaTypeAdapter(FooAdapter.class)
    private Foo foo;

    @XmlAttribute
    private String baz;

    }


    FooAdapter can be as simple as the following, but the output will be prettier if you make a proxy object to represent Foo and marshal that rather than Object[].

    class FooAdapter extends XmlAdapter<Object[], Foo> {

    @Override
    public Object[] marshal(Foo v) throws Exception {
    return new Object[]{ v.x, v.y, v.z };
    }

    @Override
    public Foo unmarshal(Object[] v) throws Exception {
    Foo foo = new Foo();
    foo.x = (String) v[0];
    foo.y = (Integer) v[1];
    foo.z = (Double) v[2];
    return foo;
    }

    }

    ReplyDelete