集合<! - ? - >在JAXB中以多个实际类型名称包装元素

时间:2014-11-10 12:58:39

标签: java xml jaxb eclipselink moxy

我有一个Response类,其中包含一些基本属性和通配符Collection<?>

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Response {
    private String approved;
    private String errorCode;
    @XmlAnyElement(lax = true)
    private Collection<?> collection;

    public Response() {
    }

    public Response(String approved, Collection<?> collection) {
        this.approved = approved;
        this.collection = collection;
    }

    public String getApproved() {
        return approved;
    }

    public String getErrorCode() {
        return errorCode;
    }

    public Collection<?> getCollection() {
        return collection;
    }
}

此集合可以包含多种类型,例如此类型:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Transaction {
    private BigDecimal amount;
    private String transactionId;

    public Transaction(BigDecimal amount, String transactionId ) {
        super();
        this.amount = amount;
        this.transactionId = transactionId ;
    }

    public Transaction() {
        super();
    }

    public BigDecimal getAmount() {
        return amount;
    }

    public String getTransactionId() {
        return transactionId;
    }

    public void setAmount(BigDecimal amount) {
        this.amount = amount;
    }

    public void setTransactionId(String transactionId) {
        this.transactionId = transactionId;
    }
}

序列化Response类时,我得到了这个XML。

<?xml version="1.0" encoding="UTF-8"?>
<response>
   <approved>00</approved>
   <errorCode></errorCode>
   <transaction>
      <amount>500.00</amount>
      <transactionId>pgka3902</transactionId>
   </transaction>
   <transaction>
      <amount>201.05</amount>
      <transactionId>abcd3020</transactionId>
   </transaction>
</response>

@XmlElementWrapper中添加<transaction><collection>个元素仍然是不可接受的。 我需要将包装器命名为集合中实际类型的复数。例如,上面的xml应该是:

<?xml version="1.0" encoding="UTF-8"?>
<response>
   <approved>00</approved>
   <errorCode />
   <transactions>
      <transaction>
         <amount>500.00</amount>
         <transactionId>pgka3902</transactionId>
      </transaction>
      <transaction>
         <amount>201.05</amount>
         <transactionId>abcd3020</transactionId>
      </transaction>
   </transactions>
</response>

是否可以使用JAXB执行此操作?我正在使用Eclipselink Moxy实现。

2 个答案:

答案 0 :(得分:2)

而不是Response持有Collection,您可以将其更改为Object。然后,您可以为每种集合类型设置不同的类。

 @XmlRootElement
 @XmlAccessorType(XmlAccessType.FIELD)
 public class Transactions {

     @XmlElement(name="transaction")
     private List<Transaction> transactions;

 }

答案 1 :(得分:0)

@XmlElementWrapper注释有一个可选参数:name。如果未指定,则默认情况下它将是Java字段的名称,在您的情况下为collection。这就是您的包装器标签名为<collection>

的原因

您可以通过将name参数传递给@XmlElementWrapper注释来指定包装器元素/标记的名称,如下所示:

@XmlElementWrapper(name="transactions")

这将产生您想要的XML标记。