2010-02-22 7 views
5

Powiedzmy mam moje obiektów domeny rozplanowane tak XML wygląda następująco:Czy istnieje sposób konfigurowania głębokości renderowania w JAXB?

<account id="1"> 
    <name>Dan</name> 
    <friends> 
    <friend id="2"> 
     <name>RJ</name> 
    </friend> 
    <friend id="3"> 
     <name>George</name> 
    </friend> 
    </friends> 
</account> 

mój obiekt domeny:

@XmlRootElement 
public class Account { 
    @XmlAttribute 
    public Long id; 
    public String name; 

    @XmlElementWrapper(name = "friends") 
    @XmlElement(name = "friend") 
    public List<Account> friends; 
} 

Czy istnieje prosty sposób skonfigurować JAXB do renderowania tylko do głębokość 2? Czyli, chciałbym mój XML wyglądać tak:

<account id="1"> 
    <name>Dan</name> 
    <friends> 
     <friend id="2" /> 
     <friend id="3" /> 
    </friends> 
</account> 
+1

Nie z JAXB, no. Powinieneś być w stanie wyprowadzić wyjście JAXB do innego procesu manipulacji XML, który to robi. – skaffman

Odpowiedz

3

Można to zrobić za pomocą XmlJavaTypeAdapter.

Zmień konto następująco:

@XmlRootElement 
public class Account { 
    @XmlAttribute 
    public Long id; 
    public String name; 

    @XmlElementWrapper(name = "friends") 
    @XmlElement(name = "friend") 
    @XmlJavaTypeAdapter(value = AccountAdapter.class) 
    public List<Account> friends; 
} 

AccountAdapter.java:

public class AccountAdapter extends XmlAdapter<AccountRef, Account> 
{ 
    @Override 
    public AccountRef marshal(Account v) throws Exception 
    { 
     AccountRef ref = new AccountRef(); 
     ref.id = v.id; 
     return ref; 
    } 

    @Override 
    public Account unmarshal(AccountRef v) throws Exception 
    { 
     // Implement if you need to deserialize 
    } 
} 

AccountRef.java:

@XmlRootElement 
public class AccountRef 
{ 
    @XmlAttribute 
    public Long id; 
} 
+0

Czy powiedziałeś to? Jestem dość pewny, że to nie zadziała, 'XmlJavaTypeAdapter' może obsłużyć tylko skalarne wartości ciągów, a nie całe elementy XML, nawet jeśli podpowiedź klasy sugeruje inaczej. – skaffman

+0

@skaffman - tak, przetestowałem to (choć zauważyłem, że zapomniałem podać definicję AccountRef - zaktualizowałem swoją odpowiedź). Kluczem jest to, że XMLJavaTypeAdapter pozwala nie tylko serializować klasę, o której JAXB nie ma pojęcia, ale także zmienić sposób klasyzacji serializowanej na podstawie poszczególnych pól. Tutaj tworzę nową klasę, która serializuje tylko pole id Konta. – mtpettyp

Powiązane problemy