【发布时间】:2017-04-20 23:39:14
【问题描述】:
我在使用 JAXB 和对象列表时遇到问题。 JAXB 用于从 Spring 4 开发的 REST api 编组/解组 XML。 类结构没有太多xml结构,在我使用ArrayList的地方
我有如下 Java 业务对象模型:
客户:
@XmlRootElement(name="client")
public class Client {
@XmlElement
public Integer age = Integer.valueOf(0);
public Client() {
super();
}
}
优惠(根元素):
@XmlRootElement
@XmlSeeAlso(Client.class)
public class Offer {
@XmlElement
public ArrayList<Client> clients = new ArrayList<Client>();
public Boolean decission = Boolean.FALSE;
public Offer() {
super();
}
}
和解组器:
public static Offern unmarshalXMLOffer(String httpMessage) throws Exception{
logger.debug("unmarshal: receved data to unmarshal: " + httpMessage);
JAXBContext jaxbContext = JAXBContext.newInstance(Offer.class, Client.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
StringReader reader = new StringReader(httpMessage);
Offer ca = (Offer)jaxbUnmarshaller.unmarshal(reader);
return ca;
}
问题:
当我发送:
<Offer>
<clients>
<client>
<age>21</age>
</client>
</clients>
<decission>false</decission>
</Offer>
我得到:Offer.Client.age = 0
但如果我发送给 unmarshaller 这个:
<Offer>
<clients>
<age>21</age>
</clients>
<decission>false</decission>
</Offer>
我得到:Offer.Client.age = 21 - 正确的价值。
根据我的知识和一些 JAXB 经验,我做了几件事:
- 我尝试使用注解 XMLSeeAlso
-
为客户列表定制包装类
@XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) @XmlSeeAlso(Client.class) 公共类 ClientsXMLWrapper { @XmlElement(name = "客户") 私人名单客户;
public ClientsXMLWrapper(){ } public ClientsXMLWrapper(List<Client> clientsList){ clients = clientsList; } public List<Client> getClients() { return clients; } public void setClients(List<Client> clients) { this.clients = clients; }}
-
我做了不同的 JAXB 初始化:
- JAXBContext jaxbContext = JAXBContext.newInstance(Offer.class, Client.class, ClientsXMLWrapper.class);
- JAXBContext jaxbContext = JAXBContext.newInstance(Offer.class, Client.class);
- JAXBContext jaxbContext = JAXBContext.newInstance(Offer.class, ClientsXMLWrapper.class);
到目前为止没有任何帮助。你能帮我解决这个问题吗? 科赫。
【问题讨论】:
标签: xml jakarta-ee jaxb