is there way link or reference xmlelements classes not used in jaxbcontext when creating marsaller?
i using jersey convert jaxb annotated object xml file.
this setup have. classes in same package.
for marsaller use classes b, c or d
@xmlaccessortype(xmlaccesstype.none) class { private foo foo; public someobject getsomeobjetct() { return foo.getsomeobjetct(); } protected setfoobehavior(foo f) { this.foo = f; } /* point xmlelements commond subclasses * , no other special manipulation take place. */ @xmlelement(...) ...somegettermethod(){} @xmlelement(...) ...someothergettermethod(){} @xmlelement(...) ...somethirdgettermethod(){} ... ... } @xmlrootelement(name = "b") class b extends a{ setfoobehavior(new fooa()); } @xmlrootelement(name = "c") class c extends a{ setfoobehavior(new fooa()); } @xmlrootelement(name = "d") class d extends a{ setfoobehavior(new foob()); } class fooa { someobject someobject; @xmlelement(name = "fooa", required = true) public someobject getsomeobjetct() { return getsomeobjetct(); } public setsomeobject(someobject someobject;) { this.someobject = someobject someobject;; } } class foob { someobject someobject; @xmlelement(name = "foob", required = true) public someobject getsomeobjetct() { return getsomeobjetct(); } public setsomeobject(someobject someobject;) { this.someobject = someobject someobject;; } }
and marsaller every case
jaxbcontext jaxbcontext = jaxbcontext.newinstance(c.class); //or b.class or d.class marshaller jaxbmarshaller = jaxbcontext.createmarshaller();
at end want have following xml results
for class c
<c> <fooa>someobjectvalue</fooa> </c>
and class d
<d> <foob>someobjectvalue</foob> </d>
what output is
<c> <someobject>someobjectvalue</someobject> <c>
and
<d> <someobject>someobjectvalue</someobject> </d>
respectively.
you mentioned someobject requires special handling in d. still have foo instance? can do:
public class { @xmlelementref public foo getfoo() { return foo; } @xmltransient public someobject getsomeobject() { return foo.getsomeobject(); } }
update: given cannot expose foo information have stored in other mechanism. following solution not great may serve:
public class { private class<?> footype; //protected should enough jax-b , //hide method rest of code. @xmlanyelement protected jaxbelement<someobject> getsomeobjetctforjaxb() { return new jaxbelement<someobject>(new qname(footype.getsimplename()), someobject.class, getsomeobjetct()); } }
do need unmarshal xml well? if you'll need setter takes in jaxbelement<someobject>
, have create foo appropriately based on name of element.
Comments
Post a Comment