JAXB:IllegalAnnotationExceptions的2个计数

时间:2012-04-03 10:34:49

标签: xml jaxb

                                         

这是我的Parser类

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());
    }
}

这是MyOrder.java文件

@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;
    }
}

这是我的域对象(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;
    }
}

这是我尝试运行程序时遇到的异常

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

4 个答案:

答案 0 :(得分:9)

对于@XmlAttribute/@XmlValue need to reference a Java type that maps to text in XML.问题,您需要将JAXBContext的初始化更改为以下内容:

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

对于Class has two properties of the same name "order"问题,您需要将protected Order order;的定义更改为private Order order;

此外,您要将@XmlRootElement(name = "BXML")课程的Order更改为@XmlRootElement(name = "Order")

答案 1 :(得分:3)

您可以看到以下示例代码,用于从给定的XML生成Java Object。它在我的系统中正常工作。

<强> 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]]]]]

答案 2 :(得分:2)

这是因为您正在创建JAXBcontext实例的该类的子元素与其中定义的元素名称不同。

示例:

@XmlType(name = "xyz", propOrder = { "a", "b", "c", "d" })
@XmlRootElement(name = "testClass")
public class TestClass
{

  @XmlElement(required = true)
  protected Status status;
  @XmlElement(required = true)
  protected String mno;
  @XmlElement(required = true)
}

在上面的类中,你没有“xyz”,但是如果你将不可用的属性名称放在JAXBContext实例化中,则抛出IlligalAnnotationException。

答案 3 :(得分:0)

如果有人对JAXB和Lombok的使用感到好奇。

我的解决方法是从根对象中删除getter和setter。