这是我的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
答案 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。