JAXB: 2 числа исключений IllegalAnnotationException - PullRequest
8 голосов
/ 03 апреля 2012

Это мой класс парсера

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 ]

10 голосов
/ 03 апреля 2012

Для проблемы @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").

3 голосов
/ 17 августа 2017

Вы можете увидеть приведенный ниже пример кода для генерации Java-объекта из заданного XML. Он отлично работает в моей системе.

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 голосов
/ 13 июня 2018

Это связано с тем, что подэлементы этого класса, который вы создаете, экземпляру 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.

0 голосов
/ 23 января 2019

Если кому-то интересно использовать JAXB и Lombok.

Мое исправление заключалось в удалении метода получения и установки из корневого объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...