【问题标题】:JAXB : 2 counts of IllegalAnnotationExceptionsJAXB:2 次 IllegalAnnotationExceptions
【发布时间】:2012-04-03 10:34:48
【问题描述】:

这是我的解析器类

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

【问题讨论】:

  • 您好,我无法解决绑定问题,我已通过邮件发送,有什么帮助吗?
  • 您是否定义了其他元素的映射(<BXML><Order>、...)?如果您只想捕获部分 XML,请查看here

标签: java xml jaxb


【解决方案1】:

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

JAXBContext jaxbContext = JAXBContext.newInstance(MyOrder.class, Order.class);

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

另外,您想将Order 类的@XmlRootElement(name = "BXML") 更改为@XmlRootElement(name = "Order")

【讨论】:

    【解决方案2】:

    您可以看到下面的示例代码从给定的 XML 生成 Java 对象。它在我的系统中运行良好。

    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 + "]";
        }
    }
    

    Customer.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 + "]";
        }
    }
    

    地址.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]]]]]
    

    【讨论】:

    • 感谢您提供完整的示例。它帮助我开始工作。 :-)
    【解决方案3】:

    这是因为您正在创建 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。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-21
        • 1970-01-01
        相关资源
        最近更新 更多