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.
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.
ReplyDeleteYou're on the right track with XmlJavaTypeAdapter, but I suspect foo needs to be an XmlElement rather than an XmlAttribute:
ReplyDelete@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;
}
}