3

同様の質問を見つけましたが、どの回答も役に立ちませんでした。

だから、バックポインタ関係を持つ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);

" a "の Json 表現は循環的です "下記参照" :

{"要素 B":{"a":{"要素 B":{"a":{"要素 B":{"a":{"要素 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) 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) で

MOXy拡張機能をプロジェクトに正しく追加していないことを知ります...(プロジェクトeclipselink.jarに追加されたばかりです)

4

1 に答える 1

1

以下が役立ちます。

デモコード

あなたのマッピングは正しいです。これは、次のデモ コードで確認できます。

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" : {
   }
}

ジャバモデル

あなたの例では、@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;
    }

}

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 を使用している場合、現在の構成では Jackson が JSON プロバイダーとして選択されています。JSON プロバイダーとして MOXy を取得する最も簡単な方法は、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;
    }

}

詳細については

于 2012-12-28T17:09:26.780 に答える