2016-10-15 2 views
0

J'ai cette classe que j'utilise pour stocker les préférences pour un outil. Cette classe utilise toString() pour se convertir en JSON. J'obtiens cette erreur de récursion infinie quand je convertis l'objet en JSON, et je n'arrive pas à comprendre pourquoi. Je n'ai pas de références circulaires donc cela me déroute un peu. Toute aide serait appréciée.Infinite Récursivité lors de la conversion de l'objet en JSON en utilisant Jackson

Voici ma structure de classe:

public class ToolPrefs 
{ 
    private boolean isFloating; 
    private ToolPalettePlacement placement; //this is an enum 
    private boolean isSelected; 
    private int dockLocation; 
    private Point dialogLocation; 
    private Dimension dialogSize; 

    public ToolPrefs(){} 

    public boolean isFloating(){return isFloating; } 

    public void setFloating(boolean floating){ isFloating = floating; } 

    public ToolPalettePlacement getPlacement(){ return placement; } 

    public void setPlacement(ToolPalettePlacement placement){ this.placement = placement;} 

    public boolean isSelected(){ return isSelected;} 

    public void setSelected(boolean selected){isSelected = selected;} 

    public int getDockLocation(){return dockLocation;} 

    public void setDockLocation(int dockLocation){this.dockLocation = dockLocation; } 

    public Point getDialogLocation(){return dialogLocation;} 

    public void setDialogLocation(Point dialogLocation){ this.dialogLocation = dialogLocation;} 

    public Dimension getDialogSize(){ return dialogSize; } 

    public void setDialogSize(Dimension dialogSize){this.dialogSize = dialogSize;} 


    @JsonIgnore @Override 
    public String toString() 
    { 
     String json; 
     ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter(); 
     try 
     { 
     json = ow.writeValueAsString(this); 
     } 
     catch (IOException e) 
     { 
     e.printStackTrace(); 
     json = ""; 
     } 
     return json; 
    } 
} 

Voici l'extrait d'exception que je reçois:

com.fasterxml.jackson.databind.JsonMappingException: Infinite récursion (par référence (StackOverflowError) chaîne: java.awt.Point ["emplacement"] -> java.awt.Point ["emplacement"] -> java.awt.Point ["emplacement"] -> java.awt.Point ["emplacement"] .. .) at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields (BeanSerializerBase.java:518) à com.fasterxml.jackson.databind.ser.BeanSerializer.serialize (BeanSerializer.java:117) à com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField (BeanPropertyWriter.java:464) à com.fasterxml.jackson. databind.ser.std.BeanSerializerBase.serializeFields (BeanSerializerBase.java:504) à com.fasterxml.jackson.databind.ser.BeanSerializer.serialize (BeanSerializer.java:117) à com.fasterxml.jackson.databind.ser. BeanPropertyWriter.serializeAsField (BeanPropertyWriter.java:464) à com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields (BeanSerializerBase.java:504) à com.fasterxml.jackson.databind.ser.BeanSerializer.serialize (BeanSerializer.java:117) à com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField (BeanPropertyWrit er.java:464) à com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields (BeanSerializerBase.java:504) à com.fasterxml.jackson.databind.ser.BeanSerializer.serialize (BeanSerializer.java: 117)

+0

essayez de supprimer @JsonIgnore de toString(); –

+0

Il n'était pas là initialement, donc je l'ai ajouté pour voir si cela résoudrait mais il n'a pas :( – ShakMan

+0

il semble que votre problème est dans la classe 'Point' que vous importez ... peut-être cela pourrait aider : http://impossible-is-development.blogspot.co.uk/2012/08/jackson-jsonmappingexception-infinite.html – thoeni

Répondre

3

le problème que vous êtes confronté est dû à la classe Point que votre objet est Embedding.

Pour résoudre ce problème, vous pouvez demander à Jackson d'arrêter au premier niveau de profondeur et de mettre en œuvre cette solution, vous pouvez suivre ces étapes:

1) Tout d'abord, vous devez exécuter 2.version x de Jackson, je l'ai testé la solution avec ceci:

<dependencies> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-databind</artifactId> 
     <version>2.8.3</version> 
    </dependency> 
</dependencies> 

2) Lorsque vous initialisez une nouvelle instance de la ObjectMapper, faites ceci:

ObjectWriter ow = new ObjectMapper().configure(DEFAULT_VIEW_INCLUSION, true).writer().withDefaultPrettyPrinter(); 

3) Si vous avez la Point le type, utilisez l'annotation:

@JsonView(Point.class) Point dialogLocation; 

Jackson nous arrêterons au premier niveau, et le résultat sera:

{ 
    "dialogLocation" : { 
    "x" : 2.0, 
    "y" : 3.0 
    } 
} 

Pour d'autres documents, vous pouvez voir ceci:

Limit Jackson output to only one level

Enable default view inclusion on Jackson 2.x ObjectMapper

Je l'ai testé la solution et il fonctionne aussi longtemps que vous utilisez la version 2.x de Jackson. Avec 1.x je n'arrivais pas encore à le faire fonctionner.

+0

Merci! Cela semble fonctionner aussi. Ce que j'ai fini par faire, c'est d'enrouler l'instance de Point dans une classe "Location" et de contourner le problème de récursion infinie. – ShakMan

-1

ou essayer

ObjectMapper mapper = new ObjectMapper(); 
String perttyStr = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(object); 
+0

Cela provoque toujours le levé mappingException – ShakMan