如何用jaxb包装子列表

当试图映射客户 – >订单1:n关系与jaxb 2.2.6我想得到包含在单独节点“订单”中的订单列表。

目前的结果是:

  100 John Doe  
100 main street, smalltown, pa
1100
5 broadway, ny, ny
1200

但我想得到:

    100 John Doe   
100 main street, smalltown, pa
1100
5 broadway, ny, ny
1200

需要改变什么才能得到这个结果?

相关的源代码有:

  • 客户界面
  • CustomerJaxbDao实现
  • 订单界面
  • OrderJaxbDao实现
  • TestCustomerWrite Junit4 Testcase

并使用此jaxb实现:

    com.sun.xml.bind jaxb-impl 2.2.6  

客户界面:

 /** * Copyright (C) 2011-2012 BITPlan GmbH * * http://www.bitplan.com * * generated: 2012-10-15 15:12 with smartGENERATOR */ package com.bitplan.testentity; import java.util.List; import com.bitplan.testentity.Order; /** * interface for Customer */ public interface Customer { // >>>{interface}{Customer}{Customer} // no implementation yet !!! // <<<{interface}{Customer}{Customer} /** * getter for name * @return name */ public String getName(); /** * setter for name * @param pname - new value for name */ public void setName(String pname); /** * getter for id * @return id */ public long getId(); /** * setter for id * @param pid - new value for id */ public void setId(long pid); /** * getter for orders * @return orders */ public List getOrders(); /** * setter for orders * @param porders - new value for orders */ public void setOrders(List porders); } // Customer 

订单界面:

 /** * Copyright (C) 2011-2012 BITPlan GmbH * * http://www.bitplan.com * * generated: 2012-10-15 at 23:59 with smartGENERATOR */ package com.bitplan.testentity; /** * interface for Order */ public interface Order { // >>>{interface}{Order}{Order} // no implementation yet !!! // <<<{interface}{Order}{Order} /** * getter for orderid * @return orderid */ public long getOrderid(); /** * setter for orderid * @param porderid - new value for orderid */ public void setOrderid(long porderid); /** * getter for shipping address * @return address */ public String getAddress(); /** * setter for shipping address * @param paddress - new value for shipping address */ public void setAddress(String paddress); } // Order 

CustomerJaxbDao实现

 /** * Copyright (C) 2011-2012 BITPlan GmbH * * http://www.bitplan.com * * generated: 2012-10-15 at 23:51 with smartGENERATOR */ package com.bitplan.testentity.jaxb; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlElement; import com.bitplan.testentity.Order; import com.bitplan.testentity.Customer; import java.util.List; import java.util.ArrayList; /** * JaxB Data access object for Customer * Entity: Customer for container testentity * Table: Customer */ @XmlRootElement(name="Customer") public class CustomerJaxbDao implements Customer { /** * name */ private String name; /** * id */ private long id; /** * orders */ private List orders=new ArrayList(); /** * getter for name * @return name */ @XmlElement(name="name") public String getName() { return name; }; /** * setter for name * @param pname - new value for name */ public void setName(String pname) { name=pname; }; /** * getter for id * @return id */ @XmlElement(name="id") public long getId() { return id; }; /** * setter for id * @param pid - new value for id */ public void setId(long pid) { id=pid; }; /** * getter for orders * @return orders */ @XmlElement(name="orders", type=OrderJaxbDao.class) public List getOrders() { return orders; }; /** * setter for orders * @param porders - new value for orders */ public void setOrders(List porders) { orders=porders; }; } // CustomerJaxbDao 

OrderJaxbDao实现

 /** * Copyright (C) 2011-2012 BITPlan GmbH * * http://www.bitplan.com * * generated: 2012-10-15 with smartGENERATOR */ package com.bitplan.testentity.jaxb; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlElement; import com.bitplan.testentity.Order; /** * JaxB Data access object for Order * Entity: Order for container testentity * Table: Order */ @XmlRootElement(name="Order") public class OrderJaxbDao implements Order { /** * orderid */ private long orderid; /** * shipping address */ private String address; /** * getter for orderid * @return orderid */ @XmlElement(name="orderid") public long getOrderid() { return orderid; }; /** * setter for orderid * @param porderid - new value for orderid */ public void setOrderid(long porderid) { orderid=porderid; }; /** * getter for shipping address * @return address */ @XmlElement(name="address") public String getAddress() { return address; }; /** * setter for shipping address * @param paddress - new value for shipping address */ public void setAddress(String paddress) { address=paddress; }; } // OrderJaxbDao 

TestCustomerWrite Junit4 Testcase

 package com.bitplan.storage.jaxb; import static org.junit.Assert.*; import java.io.StringWriter; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import org.junit.Test; import com.bitplan.testentity.Customer; import com.bitplan.testentity.Order; import com.bitplan.testentity.jaxb.CustomerJaxbDao; import com.bitplan.testentity.jaxb.OrderJaxbDao; /** * * @author wf * */ public class TestCustomerWrite { @Test public void test() throws JAXBException { Customer customer=new CustomerJaxbDao(); customer.setId(100); customer.setName("John Doe"); long orderid=1000; String[] addresses={"100 main street, smalltown, pa","5 broadway, ny, ny"}; for (String address:addresses) { Order order=new OrderJaxbDao(); order.setAddress(address); order.setOrderid(orderid+=100); customer.getOrders().add(order); } JAXBContext jaxbContext = JAXBContext.newInstance(CustomerJaxbDao.class); Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); // output pretty printed jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); StringWriter sw=new StringWriter(); jaxbMarshaller.marshal(customer, sw); System.out.println(sw); } } 

代替

 /** * getter for orders * @return orders */ @XmlElement(name="orders", type=OrderJaxbDao.class) public List getOrders() { return orders; }; 

你需要

 /** * getter for orders * @return orders */ @XmlElement(name="order", type=OrderJaxbDao.class) @XmlElementWrapper(name="orders") public List getOrders() { return orders; }; 

@XmlElementWrapper名称是包装元素(orders)的名称,@ @XmlElement名称是包装器(order)中每个条目元素的名称。

这似乎可以解决问题:

  @XmlElementWrapper(name="orders") @XmlElement(name="order", type=OrderJaxbDao.class) public List getOrders() { return orders; }; 

改进了CustomerJaxbDao

 /** * Copyright (C) 2011-2012 BITPlan GmbH * * http://www.bitplan.com * * generated: 2012-10-16 12:20 with smartGENERATOR */ package com.bitplan.testentity.jaxb; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlElement; import com.bitplan.testentity.Customer; import java.util.List; import com.bitplan.testentity.Order; import javax.xml.bind.annotation.XmlElementWrapper; import java.util.ArrayList; /** * JaxB Data access object for Customer * Entity: Customer for container testentity * Table: Customer */ @XmlRootElement(name="Customer") public class CustomerJaxbDao implements Customer { /** * name */ private String name; /** * id */ private long id; /** * orders */ private List orders=new ArrayList(); /** * getter for name * @return name */ @XmlElement(name="name") public String getName() { return name; }; /** * setter for name * @param pname - new value for name */ public void setName(String pname) { name=pname; }; /** * getter for id * @return id */ @XmlElement(name="id") public long getId() { return id; }; /** * setter for id * @param pid - new value for id */ public void setId(long pid) { id=pid; }; /** * getter for orders * @return orders */ @XmlElementWrapper(name="orders") @XmlElement(name="order", type=OrderJaxbDao.class) public List getOrders() { return orders; }; /** * setter for orders * @param porders - new value for orders */ public void setOrders(List porders) { orders=porders; }; } // CustomerJaxbDao 

听起来您想要在CustomerJaxbDao类中包装Order。

 @XmlElementWrapper( name="orders" ) @XmlElement(name="order", type=OrderJaxbDao.class) public List getOrders() { return orders; }; 

可能做你想要的。