2013-04-04 50 views
2

考慮到MOXy,我堅持使用(我猜)是一個相當微不足道的問題。將像這個例子(pastebin)這樣的類轉換爲XML是沒有問題的,將它轉換回來也沒有任何錯誤。但是,引用另一個(或更多)Person的字段將導致空值。使用JAXB&MOXy將JPA實體轉換爲XML並再次返回

有沒有什麼方法可以使這項工作沒有失去關係?我的猜測是這是由於只有ID引用,因爲JAXB無法知道其他現有對象。我試過使用@XmlInverseReference,儘管這會導致每次嘗試都會出現無限循環。

回答

2

EclipseLink MOXy@XmlInverseReference用於解決無限循環問題。我會用一個例子證明以下基於模型:

package forum15821738; 

import java.io.Serializable; 
import java.util.List; 
import javax.xml.bind.annotation.*; 

import org.eclipse.persistence.oxm.annotations.XmlInverseReference; 

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Person implements Serializable { 

    private String name; 

    @XmlInverseReference(mappedBy="children") 
    private Person parent; 

    @XmlElementWrapper 
    @XmlElement(name="child") 
    private List<Person> children; 

    public Person getParent() { 
     return parent; 
    } 

    public List<Person> getChildren() { 
     return children; 
    } 

    // OTHER GETTERS AND SETTERS 

} 

jaxb.properties

要指定莫西爲您的JAXB提供你需要包括一個名爲jaxb.properties文件在與您的域模型相同的包中使用以下條目(請參閱:http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory 

演示

package forum15821738; 

import java.io.File; 
import javax.xml.bind.*; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Person.class); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     File xml = new File("src/forum15821738/input.xml"); 
     Person person = (Person) unmarshaller.unmarshal(xml); 

     for(Person child : person.getChildren()) { 
      System.out.println(child.getParent()); 
     } 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(person, System.out); 
    } 

} 

輸入/輸出

[email protected] 
[email protected] 
<?xml version="1.0" encoding="UTF-8"?> 
<person> 
    <name>Jane</name> 
    <children> 
     <child> 
     <name>Bobbie</name> 
     </child> 
     <child> 
     <name>Sue</name> 
     </child> 
    </children> 
</person> 

更多信息

+1

謝謝布萊斯,這個例子使我對@XmlInverseReference的使用更加清晰,儘管已經閱讀了它的文檔。這樣我就可以保持關係活着。 – Aquillo 2013-04-06 20:26:42

相關問題