2016-04-06 17 views
0

herhangi bir şekilde bağlamak veya Marsaller oluştururken JAXBContext kullanılmaz sınıflardan XmlElements başvuru var mı?XmlElements, JAXBContext'te kullanılmayan bir nesneden nasıl bağlanır?

Ben XML dosyasına JAXB açıklamalı nesneyi dönüştürmek için Jersey kullanıyorum.

Bu

Ben kurulduğundan. Tüm sınıflar aynı pakette.

Her durum için sınıfları B, C veya D

@XmlAccessorType(XmlAccessType.NONE) 
class A { 
    private Foo foo; 

    public SomeObject getSomeObjetct() { 
     return foo.getSomeObjetct(); 
    } 


    protected setFooBehavior(Foo f) { 
     this.foo = f; 
    } 



    /* From this point the XmlElements are commond to all subclasses 
    * and 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;; 
    } 
} 

ve Marsaller kullanmak Marsaller için

aşağıdaki xml

sonuçları istiyorum sonunda

JAXBContext jaxbContext = JAXBContext.newInstance(C.class); //or B.class or D.class 
Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); 

olduğunu sınıf C için

<C> 
    <FooA>someObjectValue</FooA> 
</C> 

Ve D sınıfı bir çıkış şimdi sırasıyla

<C> 
    <someObject>someObjectValue</someObject> 
<C> 

ve

<D> 
    <someObject>someObjectValue</someObject> 
</D> 

olduğu gibi olsun ne

<D> 
    <FooB>someObjectValue</FooB> 
</D> 

için.

+0

Sorunuzun anladığımdan emin değilim. Görünüşe göre FooA ve FooB JAXB açıklamalıdır (her ikisi de bazıObjetct üzerinde @XmlElement içerir). Ne tür bir hata yapıyorsunuz? Ne çalışmıyor? Çıktının beklentisi nasıl değil? – Pace

+0

Açıklamayı değiştirdim ve beklediğim çıktıyı ve aldığım çıktıyı yazdım. – Chrys

cevap

0

Sen someObject hala bir Foo örneğini var mı D'de özel işlem gerektiren bunu söyledi? yapabilir misin:

public class A { 

    @XmlElementRef 
    public Foo getFoo() { 
     return foo; 
    } 

    @XmlTransient 
    public SomeObject getSomeObject() { 
     return foo.getSomeObject(); 
    } 

} 

Güncelleme: Eğer Foo maruz olamaz Verilen ardından bilgi başka bir mekanizma depolanacak gerekecektir. Aşağıdaki çözüm büyük değildir, ancak aşağıdakiler hizmet edebilir:

public class A { 

    private Class<?> fooType; 

    //protected should be enough for JAX-B and will 
    //hide the method from the rest of your code. 
    @XmlAnyElement 
    protected JAXBElement<SomeObject> getSomeObjetctForJaxb() { 
     return new JAXBElement<SomeObject>(new QName(fooType.getSimpleName()), SomeObject.class, getSomeObjetct()); 
    } 

} 

XML'i de küçümsemeye mi ihtiyacınız var? Eğer öyleyse, JAXBElement<SomeObject>'u alan bir ayarlayıcıya ihtiyacınız olacak ve elemanın ismine bağlı olarak Foo'yu uygun şekilde oluşturmanız gerekecektir.

+0

Evet Her zaman bir Foo örneğim var. Ne yazık ki A'dan foo'yu geri dönemem! Foo, someObject için farklı davranışı simüle etmek için kullanılır. Geri dönen foo, projenin büyük bir kısmında kodun değiştirilmesini talep ediyor. Acctually at FooA someObject, bir nesnenin tek bir örneğidir ve FooB'de bazı nesneler aynı nesnenin bir listesidir. Ama kimse FooA ve FooB hariç bilmemeli. Ve tabi ki, tek bir nesne veya liste davranışına sahip olabilecek yeni A alt sınıflarının varlığı da var. – Chrys

+0

Tamam, tekrar denedim. Korkarım ki bu sınıf yapısı biraz karmaşık görünüyor. Kodunuz hakkında yeterince bilgi sahibi olmamak, en iyi şekilde ortaya çıkabiliyor olmanın, kompozisyonun mirastan daha iyi hizmet edebileceği bir durum gibi hissetmesidir. – Pace

+0

Yardım için teşekkürler. Sorunumu çözdü. JAXBElement değerini döndürmek için sınıf A'daki getSomeObject yöntemini değiştirdim. Şanssız bir şekilde XmlElementRef ile çözmeye çalışıyorum ... Yukarıda verdiğim yapı tam olarak sahip olduğum şey. Sadece isimleri değiştirdim: D!Yine çok teşekkürler! – Chrys

İlgili konular