java - How to link XmlElements from an object not used in JAXBContext? -


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