2012-10-16 36 views
11

Khi cố gắng ánh xạ một khách hàng-> mối quan hệ 1: n với jaxb 2.2.6 Tôi muốn nhận được danh sách các đơn đặt hàng được bao bọc trong một "đơn đặt hàng" nút riêng biệt.Cách xếp danh sách con bằng jaxb

hiện kết quả là:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
    <Customer> 
     <id>100</id> 
     <name>John Doe</name> 
     <orders> 
     <address>100 main street, smalltown, pa</address> 
     <orderid>1100</orderid> 
     </orders> 
     <orders> 
     <address>5 broadway, ny, ny</address> 
     <orderid>1200</orderid> 
     </orders> 
    </Customer> 

nhưng tôi muốn để có được:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
    <Customer> 
     <id>100</id> 
     <name>John Doe</name> 
     <orders> 
     <order> 
      <address>100 main street, smalltown, pa</address> 
      <orderid>1100</orderid> 
     </order> 
     <order> 
      <address>5 broadway, ny, ny</address> 
      <orderid>1200</orderid> 
     </order> 
     </orders> 
    </Customer> 

gì cần phải thay đổi để có được kết quả này?

Các mã nguồn có liên quan có:

  • giao diện khách hàng
  • thực hiện CustomerJaxbDao
  • giao diện tự
  • thực hiện OrderJaxbDao
  • TestCustomerWrite Junit4 testcase

và sử dụng thực hiện jaxb này:

  <!-- JAXB --> 
    <dependency> 
     <groupId>com.sun.xml.bind</groupId> 
     <artifactId>jaxb-impl</artifactId> 
     <version>2.2.6</version> 
    </dependency> 

giao diện khách hàng:

/** 
* 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<Order> getOrders(); 

    /** 
    * setter for orders 
    * @param porders - new value for orders 
    */ 
    public void setOrders(List<Order> porders); 

} // Customer 

giao diện theo thứ tự:

/** 
* 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 

thực hiện 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<Order> orders=new ArrayList<Order>(); 

    /** 
    * 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<Order> getOrders() { return orders; }; 

    /** 
    * setter for orders 
    * @param porders - new value for orders 
    */ 
    public void setOrders(List<Order> porders) { orders=porders; }; 


} // CustomerJaxbDao 

thực hiện 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); 

    } 

} 

Trả lời

11

Thay vì

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

Bạn cần

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

Tên @XmlElementWrapper là tên của phần tử gói (đơn đặt hàng) và tên @XmlElement là tên của phần tử mỗi mục bên trong trình bao (thứ tự).

7

Điều này dường như làm các trick:

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

cải thiện 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<Order> orders=new ArrayList<Order>(); 

    /** 
    * 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<Order> getOrders() { return orders; }; 

    /** 
    * setter for orders 
    * @param porders - new value for orders 
    */ 
    public void setOrders(List<Order> porders) { orders=porders; }; 


} // CustomerJaxbDao 
3

Có vẻ như bạn muốn gói Đơn hàng trong lớp CustomerJaxbDao của mình.

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

Có thể làm những gì bạn muốn.

Các vấn đề liên quan