9

POJO を JSON にシリアル化しようとしていますが、循環参照の問題で立ち往生しています。@JsonBackReferenceandを使用して 1 対多および逆の関係を処理する方法を知っています@JsonManagedReference

私の問題は、双方向の多対多の関係 (たとえば、学生は多くのコースを持つことができ、各コースには多くの学生が登録される可能性があります) であり、親は子を参照し、子は親を参照し、ここでシリアライザが停止します。私の理解@JsonBackReferenceでは、プロパティの値の型は Bean でなければならないため、ここでは使用できません。コレクション、マップ、配列、または列挙型にすることはできません。

このシナリオをどのように処理できるか教えてください。

4

5 に答える 5

9

リレーションの一方の側で使用できます@JsonIgnoreProperties("someField")(注釈はクラスレベルです)。または@JsonIgnore

于 2011-03-17T22:22:04.250 に答える
3

@Bozhoが@JsonIgnorePropertiesを使用するように答えたので、これを試してみてください。

以下は @JsonIgnoreProperties を使用した私のモデルです。

@Entity
public class Employee implements Serializable{
    @ManyToMany(fetch=`enter code here`FetchType.LAZY)
    @JoinTable(name="edm_emp_dept_mappg", 
        joinColumns={@JoinColumn(name="emp_id", referencedColumnName="id")},
        inverseJoinColumns={@JoinColumn(name="dept_id", referencedColumnName="id")})
    @JsonIgnoreProperties(value="employee")
    Set<Department> department = new HashSet<Department>();
}


@Entity
public class Department implements Serializable {
    @ManyToMany(fetch=FetchType.LAZY, mappedBy="department")
    @JsonIgnoreProperties(value="department")
    Set<Employee> employee = new HashSet<Employee>();
}

@JsonIgnoreProperties の value 属性で、カウンター(関連) モデルのコレクション型プロパティを指定する必要があります。

于 2016-01-20T14:09:46.117 に答える
0

Dozer マッピングを使用して POJO を Map に変換し、フィールドを除外することもできます。たとえば、双方向の関係を持つ PojoA と PojoB の 2 つのクラスがある場合、次のようにマッピングを定義します。

<mapping map-id="mapA" map-null="false">
  <class-a>com.example.PojoA</class-a>
  <class-b>java.util.Map</class-b>
  <field>
    <a>fieldA</a>
    <b>this</b>
  </field>  
  <field map-id="mapB">
      <a>pojoB</a>
      <b>this</b>
      <b-hint>java.util.Map</b-hint>
  </field>
</mapping>

<mapping map-id="mapB" map-null="false">
  <class-a>com.example.PojoB</class-a>
  <class-b>java.util.Map</class-b>
  <field-exclude>
    <a>pojoA</a>
    <b>this</b>
  </field-exclude>
</mapping>

次に、上記の dozer マッピング ファイルをプロパティとして設定する Bean を定義します。

<bean id="mapper" class="org.dozer.DozerBeanMapper">
   <property name="mappingFiles">
    <list>
       <value>dozerMapping.xml</value>
    </list>
   </property>
</bean>

次に、シリアライズしているクラスで

public class TestClass
{
     @Autowired
     DozerBeanMapper mapper;

     public Map<String,Object> serializeObject(PojoA pojoA)
     {
          return ((Map<String, Object>) mapper.map(pojoA, Map.class, "mapA"));
     }
}

ドーザーのマニュアルはこちら

于 2011-03-18T04:57:19.477 に答える
-1

あなたがコレクションオブジェクトを持っているなら、それをさせてください

collection<object> listobj 

var jsonObj = from c in listobj
                  select new
                 {
                   Prop1 = c.Prop1
                    ...
                 }

これは機能し、取得したオブジェクトはjsonでシリアル化してクリーンにすることができます

于 2011-03-17T23:28:16.923 に答える