2011-05-17 18 views
5

Hey, 2 sınıfım var. Onlardan bir XML yapısı oluşturmaya çalışırken, yalnızca kök öğesini (A) alırım. Neden? Yanlış ek açıklamalar mı kullanıyorum?JAXB sınıf hiyerarşisi için ek açıklama

@XmlRootElement(name = "a") 
@XmlAccessorType(XmlAccessType.FIELD) 
public abstract class A{ 
    @XmlElement 
    int a; 

    protected A(){ 
    } 
} 

@XmlAccessorType(XmlAccessType.FIELD) 
public class B extends A{ 
    @XmlElement 
    int b; 

    protected B(){ 
    } 
}  
+0

Ve elbette alıcılar/ayarlayıcılarım var. – Udi

cevap

7

Muhtemelen üst sınıfta @XmlSeeAlso ek açıklama kullanmak gerekir:

@XmlSeeAlso(B.class) 
@XmlRootElement(name = "a") 
@XmlAccessorType(XmlAccessType.FIELD) 
public abstract class A{ 

Ben muhtemelen 'yazdım, sizin JAXB bağlamı kurarım bağlıdır çünkü. Temel olarak, serileştirilmesi gereken tüm sınıfların JAXB tarafından bilindiğinden emin olmanız gerekir. B sınıfınız başka bir yerde (örneğin, zaten JAXB tarafından bilinen sınıfların özellik tipi olarak) belirtilmemişse, JAXB, B örneklerini nasıl serileştireceğini bilme şansına sahip değildir. @XmlSeeAlso notasının amacı, JAXB'nin listelenen bu sınıflara da baktığından emin olmaktır.

GÜNCELLEME:

JAXBContext.newInstance(A.class, B.class); 

yerine

JAXBContext.newInstance(A.class); 

hangi muhtemelen: JAXBContext.newInstance(Class...) kullanarak JAXBContext nesneyi oluştururken

Alternatif örneğin tüm alt sınıflar listesini sağlayabilir yap.

Ancak, bence bu daha kötü bir çözümdür, çünkü JAXB'yi kodunuzda her kullandığınızda ilgili sınıfları düşünmenizi sağlar. En iyi çözümde ilişkileri sonsuza kadar bir kez ayarlarsınız.

+0

Cevabınız için teşekkür ederiz. Bu gerçekten işe yarıyor ama bu kötü bir nesne yönelimli çözüm ... Tek yol bu mu? JAXB, onu devirmeden tanıyamaz mı? – Udi

+0

@Udi: Güncelleme –

+0

'a bakın Teşekkürler! Bence bu yeterince iyi :) – Udi