カテゴリとアイテムの 2 つのエンティティがあります。
カテゴリ エンティティ:
@JsonInclude(Include.NON_EMPTY)
@JsonIdentityInfo(generator = ObjectIdGenerators.UUIDGenerator.class)
@Entity
public class Category {
@Id
@GeneratedValue
private int id;
private String categoryName;
@OneToMany(mappedBy = "category")
private List<Item> itemList;
//have getters and setters
}
アイテム エンティティ:
@JsonIdentityInfo(generator = ObjectIdGenerators.UUIDGenerator.class)
@Entity
public class Item {
@Id
@GeneratedValue
private int id;
private String itemName;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "fk_Category_id")
private Category category;
//have getters and setters
}
次のような左結合クエリを実行した後: "SELECT c from Category c Left JOIN FETCH c.itemList il"
結果を取得し、結果に対して休止状態対応の JSON シリアル化を実行しました。
私の HibernateAwareObjectMapper は次のとおりです。
public class HibernateAwareObjectMapper extends ObjectMapper {
public HibernateAwareObjectMapper() {
Hibernate4Module hibernateModule = new Hibernate4Module();
hibernateModule.disable(Hibernate4Module.Feature.FORCE_LAZY_LOADING);
registerModule(hibernateModule);
}
}
HibernateAwareSerializerFactory は次のとおりです。
public class HibernateAwareSerializerFactory extends BeanSerializerFactory {
protected HibernateAwareSerializerFactory(SerializerFactoryConfig config) {
super(config);
}
}
私のディスパッチャーサーブレットでは、次のように書いています。
<mvc:annotation-driven>
<mvc:message-converters>
<bean
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="org.scinv.hibernateAwareMapper.HibernateAwareObjectMapper" />
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
だから、私はこのようなJSONを持っています:
{
"ArrayList": [
{
"@id": "971ef69e-1605-46f2-8234-b595e38be11a",
"id": 1,
"categoryName": "fruit",
"itemList": [
{
"@id": "75a3a7e5-ce66-4f6d-a04c-d04145d92b21",
"id": 1,
"itemName": "mango",
"category": "971ef69e-1605-46f2-8234-b595e38be11a"
},
{
"@id": "0aa0fb71-2909-4909-8403-0765829ee8c1",
"id": 2,
"itemName": "apple",
"category": "971ef69e-1605-46f2-8234-b595e38be11a"
},
{
"@id": "02c381cb-33fa-45a6-bff9-ec146357f4bc",
"id": 3,
"itemName": "orange",
"category": "971ef69e-1605-46f2-8234-b595e38be11a"
}
]
},
"971ef69e-1605-46f2-8234-b595e38be11a",
"971ef69e-1605-46f2-8234-b595e38be11a"
]
}
この JSON には、Category Entity のオブジェクト ID である "@id": "971ef69e-1605-46f2-8234-b595e38be11a" があります。
また、Item Entity の Object Id である "@id": "75a3a7e5-ce66-4f6d-a04c-d04145d92b21" があります。
カテゴリには 3 つのアイテムがあるため、カテゴリのオブジェクト ID もさらに 2 回表示されます。このように: "971ef69e-1605-46f2-8234-b595e38be11a","971ef69e-1605-46f2-8234-b595e38be11a"
その生成された JSON シリアライゼーションは期待どおりです。しかし、そのオブジェクト参照「@id」をそのjsonで非表示にする必要があります。この「@id」は、デフォルトで @JsonIdentityInfo によって作成されます。
したがって、オブジェクト ID「@id」を非表示にするには、@JsonIdentityInfo の構成が必要です。@JsonIgnore を試しましたが失敗しました。
解決策を求めて 2 日間グーグル検索しましたが、失敗しました。誰か解決策や提案を教えてもらえますか?