Skip to main content

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.


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

Post a Comment

Popular posts from this blog

Why is this Javascript much *slower* than its jQuery equivalent?

I have a HTML list of about 500 items and a "filter" box above it. I started by using jQuery to filter the list when I typed a letter (timing code added later): $('#filter').keyup( function() { var jqStart = (new Date).getTime(); var search = $(this).val().toLowerCase(); var $list = $('ul.ablist > li'); $list.each( function() { if ( $(this).text().toLowerCase().indexOf(search) === -1 ) $(this).hide(); else $(this).show(); } ); console.log('Time: ' + ((new Date).getTime() - jqStart)); } ); However, there was a couple of seconds delay after typing each letter (particularly the first letter). So I thought it may be slightly quicker if I used plain Javascript (I read recently that jQuery's each function is particularly slow). Here's my JS equivalent: document.getElementById('filter').addEventListener( 'keyup', function () { var jsStart = (new Date).getTime()...