1

I'm using Spring Roo 1.2.1 and Jackson 1.9.7. On serialization my class QueueOut with json I get an JsonMappingException.

I read the following posts, but find no working solution for me:

Infinite Recursion with Jackson

Jackson - serialization of entities with birectional relationships (avoiding cycles)

I don't know why JsonIgnore is not working in the class Queue for the property QueueOuts. I also tried JsonManagedReference but same error. Using Jackson 2.0.0 is no solution because it is not supported by Spring 3.1

Any suggestions?

Here a part of my stacktrace:

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)

Here my classes: First

 @RooJavaBean
 @RooToString
 public class QueueOut {

   private String name;

   private String description;

   @JsonIgnore
   @ManyToOne
   private GenericQueue genericQueue;


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

}

Second

@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>();
}
Community
  • 1
  • 1

3 Answers3

3

You have to use @JsonIgnore on your getter

gabi
  • 1,324
  • 4
  • 22
  • 47
1

Use @JsonIgnore on the getter od ignore completely the property using @JsonIgnoreProperties(value = { "propertyName" })

lrkwz
  • 6,105
  • 3
  • 36
  • 59
1

Do not use JsonIgnore, from 1.9 use JsonManagedReference and JsonBackReference on the getters of your problematic properties. You can see two great examples at:

Javi Vazquez
  • 517
  • 6
  • 21