我有一个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实现。
答案 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标记。