1

Spring Roo 1.2.1 と Jackson 1.9.7 を使用しています。クラス QueueOut を json でシリアル化すると、JsonMappingException が発生します。

次の投稿を読みましたが、有効な解決策が見つかりません。

Jackson による無限再帰

Jackson - 二項関係を持つエンティティのシリアル化 (サイクルの回避)

プロパティ QueueOuts のクラス Queue で JsonIgnore が機能しない理由がわかりません。JsonManagedReference も試しましたが、同じエラーが発生しました。Spring 3.1 でサポートされていないため、Jackson 2.0.0 を使用しても解決策にはなりません。

助言がありますか?

ここに私のスタックトレースの一部:

Caused by: org.springframework.amqp.support.converter.MessageConversionException: Failed to convert Message content
  at org.springframework.amqp.support.converter.JsonMessageConverter.createMessage(JsonMessageConverter.java:181)
  at org.springframework.amqp.support.converter.AbstractMessageConverter.toMessage(AbstractMessageConverter.java:51)
  at org.springframework.amqp.rabbit.core.RabbitTemplate.convertMessageIfNecessary(RabbitTemplate.java:482)
  at org.springframework.amqp.rabbit.core.RabbitTemplate.convertAndSend(RabbitTemplate.java:358)
  at org.springframework.amqp.rabbit.core.RabbitTemplate.convertAndSend(RabbitTemplate.java:346)
  at de.company.prs.admin.server.amqp.AdminQueueConsumer.onMessage(AdminQueueConsumer.java:52)
  at org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter.onMessage(MessageListenerAdapter.java:328)
  at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:505)
  ... 10 more
 Caused by: org.codehaus.jackson.map.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: de.company.prs.admin.server.domain.Queue["queueOuts"]->org.hibernate.collection.PersistentSet[0]->de.company.prs.admin.server.domain.QueueOut["queue"]->de.company.prs.admin.server.domain.Queue["queueOuts"]->org.hibernate.collection.PersistentSet[0]->de.company.prs.admin.server.domain.QueueOut["queue"]->de.company.prs.admin.server.domain.Queue["queueOuts"]->org.hibernate.collection.PersistentSet[0]->de.company.prs.admin.server.domain.QueueOut["queue"]->de.company.prs.admin.server.domain.Queue["queueOuts"]->org.hibernate.collection.PersistentSet[0]->de.company.prs.admin.server.domain.QueueOut["queue"]->de.company.prs.admin.server.domain.Queue["queueOuts"]->org.hibernate.collection.PersistentSet[0]->de.company.prs.admin.server.domain.QueueOut["queue"]->de.company.prs.admin.server.domain.Queue["queueOuts"]->org.hibernate.collection.PersistentSet[0]->de.company.prs.admin.server.domain.QueueOut["queue"]->de.company.prs.admin.server.domain.Queue["queueOuts"]->org.hibernate.collection.PersistentSet[0]->de.company.prs.admin.server.domain.QueueOut["queue"]->de.company.prs.admin.server.domain.Queue["queueOuts"]->org.hibernate.collection.PersistentSet[0]
  at org.codehaus.jackson.map.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:164)
  at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:112)
  at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:446)
  at org.codehaus.jackson.map.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:150)
  at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:112)

ここで私のクラス:最初

 @RooJavaBean
 @RooToString
 public class QueueOut {

   private String name;

   private String description;

   @JsonIgnore
   @ManyToOne
   private GenericQueue genericQueue;


   @ManyToOne (fetch = FetchType.EAGER)
   private Queue queue;

}

2番

@RooJavaBean
@RooToString
@RooJpaActiveRecord
public class Queue {

   private String name;

   private String description;

   @JsonIgnore
   @OneToMany(cascade = CascadeType.ALL, mappedBy = "queue",  fetch = FetchType.EAGER)
   private Set<QueueOut> QueueOuts = new HashSet<QueueOut>();
}
4

3 に答える 3

3

ゲッターで @JsonIgnore を使用する必要があります

于 2012-11-21T07:15:52.840 に答える
1

JsonIgnore を使用しないでください。1.9 以降では、問題のあるプロパティのゲッターで JsonManagedReference と JsonBackReference を使用してください。次の場所で 2 つの優れた例を見ることができます。

于 2014-11-01T15:52:52.487 に答える
0

ゲッターで@JsonIgnoreを使用し、@ JsonIgnoreProperties(value = {"propertyName"})を使用してプロパティを完全に無視します。

于 2012-11-30T18:07:04.680 に答える