2010-02-22 6 views
5

Digamos que tengo los objetos de dominio dispuestos de tal manera el XML tiene el siguiente aspecto:¿Hay alguna manera de configurar la profundidad de representación en JAXB?

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

Mi dominio del objeto:

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

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

¿Hay una manera fácil de configurar JAXB para rendir sólo para una profundidad de 2? Es decir, me gustaría que mi XML para tener este aspecto:

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

No con JAXB, no. Sin embargo, debería poder canalizar la salida de JAXB hacia algún otro proceso de manipulación XML. – skaffman

Respuesta

3

Esto se puede hacer utilizando un XmlJavaTypeAdapter.

Cambio cuenta de la siguiente manera:

@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

¿Has sentido esto? Estoy bastante seguro de que esto no funcionará, 'XmlJavaTypeAdapter' solo puede manejar valores de cadenas escalares, no elementos enteros de XML, incluso si la firma de clase sugiere lo contrario. – skaffman

+0

@skaffman - sí, lo he probado (aunque noté que olvidé incluir la definición de AccountRef - He actualizado mi respuesta). La clave es que XMLJavaTypeAdapter le permite no solo serializar una clase que JAXB no conoce, sino también cambiar la forma en que una clase se serializa por campo. Aquí estoy creando una nueva clase que serializa solo el campo de identificación de una cuenta. – mtpettyp

Cuestiones relacionadas