我在網上找到了JAXB2 @XmlRegistry
的一些例子,但沒有深入的教程討論使用@XmlRegistry
和@XmlElementDecl
的概念,不知道它的一個概念通常沒有太多的探索。@XmlRegistry - 它是如何工作的?
反正這是我的問題,首先,我使用解組使用JAXB的XML一些示例類:
我試圖使用JAXB解組的主類 - Employee.java
package com.test.jaxb;
import java.util.List;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.XmlElementDecl;
import javax.xml.bind.annotation.XmlRegistry;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.namespace.QName;
import com.test.jaxb.dto.Address;
@XmlRootElement
public class Employee {
private int id;
private String name;
private String email;
private List<Address> addresses;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public List<Address> getAddresses() {
return addresses;
}
public void setAddresses(List<Address> addresses) {
this.addresses = addresses;
}
@SuppressWarnings("unused")
@XmlRegistry
public static class XMLObjectFactory {
@XmlElementDecl(scope = Employee.class, name= "id")
JAXBElement<String> createEmployeeId(String value) {
return new JAXBElement<String>(new QName("id"), String.class, "100");
}
@XmlElementDecl(scope = Employee.class, name= "name")
JAXBElement<String> createName(String value) {
return new JAXBElement<String>(new QName("name"), String.class, "Fake Name");
}
@XmlElementDecl(scope = Employee.class, name= "email")
JAXBElement<String> createEmail(String value) {
return new JAXBElement<String>(new QName("email"), String.class, value);
}
@XmlElementDecl(scope = Employee.class, name= "addresses")
JAXBElement<List> createAddresses(List value) {
return new JAXBElement<List>(new QName("addresses"), List.class, value);
}
}
}
子類 - Address.java
package com.test.jaxb.dto;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.XmlElementDecl;
import javax.xml.bind.annotation.XmlRegistry;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.namespace.QName;
import com.test.jaxb.Employee;
@XmlRootElement
public class Address {
private String addressLine1;
private String addressLine2;
private String addressLine3;
public String getAddressLine1() {
return addressLine1;
}
public void setAddressLine1(String addressLine1) {
this.addressLine1 = addressLine1;
}
public String getAddressLine2() {
return addressLine2;
}
public void setAddressLine2(String addressLine2) {
this.addressLine2 = addressLine2;
}
public String getAddressLine3() {
return addressLine3;
}
public void setAddressLine3(String addressLine3) {
this.addressLine3 = addressLine3;
}
@SuppressWarnings("unused")
@XmlRegistry
private static class XMLObjectFactory {
@XmlElementDecl(scope = Employee.class, name= "addressLine1")
JAXBElement<String> createAddressLine1(String value) {
return new JAXBElement<String>(new QName("addressLine1"), String.class, value);
}
@XmlElementDecl(scope = Employee.class, name= "addressLine2")
JAXBElement<String> createAddressLine2(String value) {
return new JAXBElement<String>(new QName("addressLine2"), String.class, value);
}
@XmlElementDecl(scope = Employee.class, name= "addressLine3")
JAXBElement<String> createAddressLine3(String value) {
return new JAXBElement<String>(new QName("addressLine3"), String.class, value);
}
}
}
XML以解組 - employee.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<employee>
<id>1</id>
<name>Vaishali</name>
<email>[email protected]</email>
<addresses>
<address>
<addressLine1>300</addressLine1>
<addressLine2>Mumbai</addressLine2>
<addressLine3>India</addressLine3>
</address>
<address>
<addressLine1>301</addressLine1>
<addressLine2>Pune</addressLine2>
<addressLine3>India</addressLine3>
</address>
</addresses>
</employee>
解組代碼:
package com.test.jaxb;
import java.io.FileReader;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
public class ObjectFactoryTest {
public static void main(String[] args) throws Exception {
FileReader reader = new FileReader("resources/employee.xml");
JAXBContext context = JAXBContext.newInstance(Employee.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
Object obj = unmarshaller.unmarshal(reader);
System.out.println(obj);
}
}
當我使用上面的代碼解編員工XML,地址列表沒有得到填充。由此產生的員工對象只有一個空白的地址列表。我的映射有什麼問題嗎?
爲了找出發生了什麼,並查看員工對象是否實際上是使用對象工廠(具有@XMLRegistry註釋)創建的,我在工廠方法中更改了id和name的值,但是它們沒有影響在輸出中,它告訴我JAXB實際上並沒有使用ObjectFactory,爲什麼?
我會不會這樣都錯了?任何幫助,將不勝感激。
我發現了幾個'@XmlRegistry'的例子,就像我使用它一樣,看看[這裏](http://www.codezealot.org/archives/5)。我明白我可以使用'@XmlElementWrapper'來做到這一點。我的問題更多的是瞭解'@XmlRegistry'是什麼以及我可以用它做什麼。 AFAIK我應該能夠使用objectfactory(用'@XmlRegistry'註解)解組一個xml並將其轉換爲一個對象。如果不是,它用於什麼?我是否需要在某處註冊它才能使用它(就像我在我的例子中演示的那樣,我的對象工廠從未真正被JAXB使用過)? – gresdiplitude
我的理解可能在這裏完全有缺陷的,但我認爲必須有應用類似的東西的一種方式「@XmlElementWrapper」到「@XmlRegistry」,因爲它的解組XML的另一種方式。沒有猜測的點我完全困惑@XmlRegistry如何工作! – gresdiplitude
@Vaishali - 我已經更新了我的答案,包括一個例子利用'@ XmlRegistry'和'@ XmlElementDecl' –