2010-02-22 69 views
5

比方说,我有我的域对象制定了这样的XML看起来是这样的:有没有办法在JAXB中配置渲染深度?

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

我的域对象:

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

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

有一种简单的方法来配置JAXB只渲染到深度2?意思是,我想我的XML看起来像这样:

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

不与JAXB,没有。尽管如此,您应该能够将JAXB的输出传递给其他一些XML操作过程。 – skaffman 2010-02-22 22:41:32

回答

3

您可以使用XmlJavaTypeAdapter做到这一点。

更改帐户如下:

@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

你有没有讨厌这个?我相当肯定这是行不通的,即使类签名提出了另外的建议,“XmlJavaTypeAdapter”只能处理标量字符串值,而不能处理整个XML元素。 – skaffman 2010-02-23 08:39:02

+0

@skaffman - 是的,我测试了它(尽管我注意到我忘记了包含AccountRef的定义 - 我已经更新了我的答案)。关键是XMLJavaTypeAdapter不仅可以序列化JAXB不知道的类,还可以更改每个字段序列化的类。在这里,我创建了一个新的类,它仅序列化帐户的ID字段。 – mtpettyp 2010-02-23 12:53:18

相关问题