2012-12-25 83 views
3

我發現了類似的問題,但沒有任何答案對我有幫助。@XmlInverseReference註解不起作用

所以,我有2個對象與回指關係。 家長:

@XmlRootElement 
public class A { 

    private B b; 

    @XmlElement(name = "Element B") 
    public B getB() { 
     return b; 
    } 

    public void setB(B b) { 
     this.b = b; 
    } 

} 

和B:

@XmlRootElement 
public class B { 

    private A a; 

    @XmlInverseReference(mappedBy = "b") 
    public A getA() { 
     return a; 
    } 

    public void setA(A a) { 
     this.a = a; 
    } 

} 

我已經把jaxb.properties在同一個包款。 (javax.xml.bind.context.factory的= org.eclipse.persistence.jaxb.JAXBContextFactory)

而這個片斷後:

A a = new A(); 
a.setB(new B()); 
a.getB().setA(a); 

JSON表示 「一個」 是環狀「見下文「:

{」 元素B 「:{」 一 「:{」 元素B 「:{」 一 「:{」 元素B 「:{」 一 「:{」 元素 B 「:{」 a「:{」元素B「:{」a「:{」元素B「:{」a「:{」元素 B「:{」a「:{」元素B「:{」a「:{元素B「:{」a「:{」.........

和棧跟蹤也是環狀:

在 org.codehaus.jackson.map.ser.BeanSerializer.serializeFields(BeanSerializer.java:245) 在 org.codehaus.jackson。 map.ser.BeanSerializer.serialize(BeanSerializer.java:212) 在 org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:428) 在 org.codehaus.jackson.map.ser。 BeanSerializer.serializeFields(BeanSerializer.java:245) at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:212) 在 org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:428) 在 org.codehaus .jackson.map.ser.BeanSerializer.serializeFields(BeanSerializer.java:245)

我quess,我已經不corectly添加莫西延伸到我的項目......(一個剛剛添加到項目eclipselink.jar)

回答

1

以下內容應該有所幫助:

DEMO CODE

您的映射是正確的。您可以使用以下演示代碼進行驗證。

package forum14031963; 

import java.util.*; 
import javax.xml.bind.*; 
import org.eclipse.persistence.jaxb.JAXBContextProperties; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     Map<String, Object> properties = new HashMap<String, Object>(2); 
     properties.put(JAXBContextProperties.MEDIA_TYPE, "application/json"); 
     properties.put(JAXBContextProperties.JSON_INCLUDE_ROOT, false); 
     JAXBContext jc = JAXBContext.newInstance(new Class[] {A.class}, properties); 

     A a = new A(); 
     a.setB(new B()); 
     a.getB().setA(a); 

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

} 

輸出

下面是來回運行演示代碼的輸出。

{ 
    "Element B" : { 
    } 
} 

Java模型

在您的示例@XmlRootElement註釋不是必需的,我已經刪除它們。如果他們在那裏,演示代碼也會以相同的方式工作。

package forum14031963; 

import javax.xml.bind.annotation.XmlElement; 

public class A { 

    private B b; 

    @XmlElement(name = "Element B") 
    public B getB() { 
     return b; 
    } 

    public void setB(B b) { 
     this.b = b; 
    } 

} 

package forum14031963; 

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

public class B { 

    private A a; 

    @XmlInverseReference(mappedBy = "b") 
    public A getA() { 
     return a; 
    } 

    public void setA(A a) { 
     this.a = a; 
    } 

} 

jaxb.properties

要指定MOXy作爲您的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 

JAX-RS

如果使用JAX-RS,在當前的配置傑克遜被拾起的JSON提供商。將MOXY作爲您的JSON提供商的最簡單方法是使用MOXyJsonProvider類。

package org.example; 

import java.util.*; 
import javax.ws.rs.core.Application; 
import org.eclipse.persistence.jaxb.rs.MOXyJsonProvider; 

public class CustomerApplication extends Application { 

    @Override 
    public Set<Class<?>> getClasses() { 
     HashSet<Class<?>> set = new HashSet<Class<?>>(2); 
     set.add(MOXyJsonProvider.class); 
     set.add(CustomerService.class); 
     return set; 
    } 

} 

更多信息