2012-04-03 18 views
5

JAXB: 2 tội danh IllegalAnnotationExceptions

Đây là lớp Parser tôi

public class Test { 
    public static void main(String args[]) throws Exception { 

     File file = new File("D:\\Test.xml"); 
     JAXBContext jaxbContext = JAXBContext.newInstance(MyOrder.class); 
     Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 
     MyOrder customer = (MyOrder) jaxbUnmarshaller.unmarshal(file); 
     System.out.println(customer.getOrder().getSide()); 
    } 
} 

Đây là MyOrder.java nộp

@XmlRootElement(name = "BXML") 
public class MyOrder { 
    @XmlElement(name = "Bag") 
    protected Order order; 

    public MyOrder() { 

    } 
    @XmlAttribute 
    public Order getOrder() { 
     return order; 
    } 
    public void setOrder(Order order) { 
     this.order = order; 
    } 
} 

Đây là đối tượng tên miền của tôi (Order.java)

@XmlRootElement(name = "BXML") 
public class Order { 

    public Order() { 

    } 

    @XmlAttribute(name = "Side") 
    protected BigInteger Side; 

    @XmlValue 
    public BigInteger getSide() { 
     return Side; 
    } 

    public void setSide(BigInteger side) { 
     Side = side; 
    } 
} 

Đây là ngoại lệ tôi đang nhận được khi tôi đã cố gắng để chạy các chương trình

Exception in thread "main" com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions 
@XmlAttribute/@XmlValue need to reference a Java type that maps to text in XML. 
    this problem is related to the following location: 
     at public com.Order com.MyOrder.getOrder() 
     at com.MyOrder 
Class has two properties of the same name "order" 
    this problem is related to the following location: 
     at public com.Order com.MyOrder.getOrder() 
     at com.MyOrder 
    this problem is related to the following location: 
     at protected com.Order com.MyOrder.order 
     at com.MyOrder 
+0

Hi, tôi có thể không có khả năng giải quyết vấn đề ràng buộc, tôi gửi trong thư, bất kỳ Cứu giúp ? – Pawan

+0

Bạn đã xác định ánh xạ cho các phần tử khác của mình ('', '', ...)? Nếu bạn chỉ muốn nắm bắt một phần của XML, hãy kiểm tra [ở đây] (http://stackoverflow.com/questions/8526002). –

Trả lời

7

Đối với vấn đề @XmlAttribute/@XmlValue need to reference a Java type that maps to text in XML. bạn cần thay đổi khởi tạo lại JAXBContext như sau:

JAXBContext jaxbContext = JAXBContext.newInstance(new Class[] {MyOrder.class, 
                    Order.class}); 

Đối với sự cố Class has two properties of the same name "order", bạn cần thay đổi định nghĩa của protected Order order; thành private Order order;.

Ngoài ra, bạn muốn thay đổi số @XmlRootElement(name = "BXML") của lớp Order thành @XmlRootElement(name = "Order").

3

Bạn có thể xem mã mẫu dưới đây để tạo đối tượng Java từ XML đã cho. Nó hoạt động tốt trong hệ thống của tôi.

customer.xml

<?xml version="1.0" encoding="UTF-8"?> 
<company> 
    <customer id="100"> 
     <age>25</age> 
     <name>Ram</name> 
     <Address> 
      <city>Bangalore</city> 
      <country>India</country> 
     </Address> 
     <Address> 
      <city>Patna</city> 
      <country>India</country> 
     </Address> 
    </customer> 

    <customer id="200"> 
     <age>26</age> 
     <name>Ashu</name> 
     <Address> 
      <city>Delhi</city> 
      <country>India</country> 
     </Address> 
     <Address> 
      <city>Madhubani</city> 
      <country>India</country> 
     </Address> 
    </customer> 
</company> 

Company.java

import java.util.List; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlRootElement(name="company") 
public class Company { 

    @XmlElement(name="customer") 
    private List<Costumer> custList; 
    // 

    public List<Costumer> getCustList() { 
     return custList; 
    } 

    public void setCustList(List<Costumer> custList) { 
     this.custList = custList; 
    } 
    // 

    @Override 
    public String toString() { 
     return "Company [custList=" + custList + "]"; 
    } 
} 

Costumer.java

@XmlAccessorType(XmlAccessType.FIELD) 
class Costumer { 
    @XmlElement(name="name") 
    private String name; 

    @XmlElement(name="age") 
    private int age; 

    @XmlElement(name="id") 
    private int id; 

    @XmlElement(name="Address") 
    private List<Address> addressList; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public int getAge() { 
     return age; 
    } 

    public void setAge(int age) { 
     this.age = age; 
    } 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public List<Address> getAddressList() { 
     return addressList; 
    } 

    public void setAddressList(List<Address> addressList) { 
     this.addressList = addressList; 
    } 

    @Override 
    public String toString() { 
     return "Customer [name=" + name + ", age=" + age + ", id=" + id + ", addressList=" + addressList + "]"; 
    } 
} 

Address.java

@XmlAccessorType(XmlAccessType.FIELD) 
class Address { 
    @XmlElement(name="city") 
    private String city; 

    @XmlElement(name="country") 
    private String country; 
    // 
    public String getCity() { 
     return city; 
    } 

    public void setCity(String city) { 
     this.city = city; 
    } 
    public String getCountry() { 
     return country; 
    } 

    public void setCountry(String country) { 
     this.country = country; 
    } 
    // 
    @Override 
    public String toString() { 
     return "Address [city=" + city + ", country=" + country + "]"; 
    } 
} 

TestMain.java

import java.io.File; 

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBException; 
import javax.xml.bind.Unmarshaller; 

public class TestMain { 

    public static void main(String[] args) { 

     String xmlPath = "C:\\" + File.separator + "customer.xml"; 

     try { 

      File file = new File(xmlPath); 

      JAXBContext jaxbContext = JAXBContext.newInstance(new Class[] {Company.class,Address.class,Costumer.class}); 
      Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 
      Company customer = (Company) jaxbUnmarshaller.unmarshal(file); 
      System.out.println(customer); 

      } catch (JAXBException e) { 
      e.printStackTrace(); 
      } 
    } 
} 
Outout: 
Company [custList=[Customer [name=Ram, age=25, id=0, addressList=[Address [city=Bangalore, country=India], Address [city=Patna, country=India]]], Customer [name=Ashu, age=26, id=0, addressList=[Address [city=Delhi, country=India], Address [city=Madhubani, country=India]]]]] 
+0

Cảm ơn bạn đã có một ví dụ hoàn chỉnh. Nó giúp tôi làm việc. :-) –