0

私は2つのクラスを持っています:

public class A implements Serializable {
    ...
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "fieldID")
    private Collection<B> bCollection;
    ...
    public Collection<B> getBCollection()
    {
       return bCollection;
    }
    public void setBCollection(Collection<B> bCollection)
    {
       this.bCollection = bCollection;
    }
}

public class B implements Serializable {
    ...
    @JoinColumn(name = "aID", referencedColumnName = "id")
    @ManyToOne(optional = false)
    private A aID;
    ...
    @XmlTransient
    public A getAID() {
       return aID;
    }
    public void setAID(A aID) {
       this.aID= aID;
    }
}

私はいつもAクラスを使用していました-意図したとおりに機能していますが、今BはRESTfulGETメソッドでクラスを使用したいと考えています。ただし、それをしようとすると、フィールド@XmlTransientが表示されなくなりAます。クラスを使用しているときにクラスで使用し、クラスを使用しているときにクラスで@XmlTransient使用することは可能ですか?ABBA

4

1 に答える 1

1

簡単な解決策の 1 つは、https://eclipse.org/eclipselink/moxy.php@XmlInverseReferenceをインクルードし、双方向の依存関係にアノテーションを使用することです。http://eclipse.org/eclipselink/api/2.2/org/eclipse/persistence/oxm/annotations/XmlInverseReference.html .

それが不可能な場合は、使用している JAXB/JAX-RS 実装に関する詳細情報を提供して、問題のより具体的な解決策を見つけられるようにしてください。

一般に、シリアル化プロセスを制御し、特定のオブジェクト/フィールドをシリアル化する方法と、それらをシリアル化する必要があるかどうかを決定することが考えられます。たとえば、次の戦略で実現できます。

  1. クラス A が直列化されるとき、クラス B をオブジェクト全体としてではなく、単なる String 表現として直列化します。たとえば、 を使用し@XmlAttribute @XmlIDREFます。

  2. たとえば、何らかの種類のフィルター/除外を設定して、シリアライゼーション プロセスを制御します (JAX-RS 実装が提供するものによって異なります)。

        ExclusionStrategy() {
    
        public boolean shouldSkipClass(Class<?> clazz) {
            return (clazz == B.class);
        }
    
        /**
          * Custom field exclusion goes here
          */
        public boolean shouldSkipField(FieldAttributes f) {
            return false;
        }
    
     }
    
于 2015-03-02T10:25:56.510 に答える