2017-01-10 11 views
2

私はpojo DTNodoを持っています。再帰的なプロパティはList<DTNodo>です。 jacksonを使用してjsonスキーマを生成しようとすると、私はjava.lang.StackOverflowErrorの例外を受け取ります。Jackson ObjectMapperは再帰的データ型でエラーを返します

Listプロパティを削除しても正常に動作するため、問題は再帰にあります。

ObjectMapperにこの再帰を伝えて適切に処理する方法はありますか?このjsonスキーマを生成する他の方法はありますか?

DTNodoクラス

public class DTNodo implements Serializable { 

    private static final long serialVersionUID = 1L; 

    private Integer idNodo; 
    private String codigo; 
    private String descripcion; 
    private String detalle; 
    private Integer orden; 

    private List<DTNodo> hijos; 

    public Integer getIdNodo() { 
     return idNodo; 
    } 

    public void setIdNodo(Integer idNodo) { 
     this.idNodo = idNodo; 
    } 

    public String getCodigo() { 
     return codigo; 
    } 

    public void setCodigo(String codigo) { 
     this.codigo = codigo; 
    } 

    public String getDescripcion() { 
     return descripcion; 
    } 

    public void setDescripcion(String descripcion) { 
     this.descripcion = descripcion; 
    } 

    public String getDetalle() { 
     return detalle; 
    } 

    public void setDetalle(String detalle) { 
     this.detalle = detalle; 
    } 

    public Integer getOrden() { 
     return orden; 
    } 

    public void setOrden(Integer orden) { 
     this.orden = orden; 
    } 

    public List<DTNodo> getHijos() { 
     return hijos; 
    } 

    public void setHijos(List<DTNodo> hijos) { 
     this.hijos = hijos; 
    } 

} 

IはObjectMapper.generateJsonSchemaが廃止されjsonschema

public static String getJsonSchema(Class<?> clazz) { 
    ObjectMapper mapper = new ObjectMapper(); 
    JsonSchema schema; 
    try { 
     schema = mapper.generateJsonSchema(clazz); 

     return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(schema); 

    } catch (IOException e) { 
     return "Error al generar JsonSchema: " + e.getMessage(); 
    } 
} 
+0

バージョン:

あなたは@JsonManagedReference、@JsonBackReference に詳細情報を使用することができますか? – dnault

+1

私はcom.fasterxml.jackson.core 2.8.5を使用しています。以前は、org.codehaus.jackson 1.9.13を使用していました。どちらも私に同じエラーを与えました。 – aleviera

答えて

2

を生成するために使用されるコード。代わりにthe new JSON schema moduleを使用します。

プロジェクトにcom.fasterxml.jackson.module:jackson-module-jsonSchema:${jacksonVersion}を追加して、このようなスキーマを生成:

ObjectMapper mapper = new ObjectMapper(); 
JsonSchemaGenerator schemaGen = new JsonSchemaGenerator(mapper); 
JsonSchema schema = schemaGen.generateSchema(clazz); 
mapper.writerWithDefaultPrettyPrinter().writeValueAsString(schema); 

正しいパッケージから現代JsonSchemaをインポートすることを確認してください:

import com.fasterxml.jackson.module.jsonSchema.JsonSchema; 
+0

完璧に働いた。ありがとう! – aleviera

0

簡単な方法アウトはありません。 pojoの参照ループを引き起こすプロパティを一度に直列化しないでください。

次の例のようなものを達成することができます(オブジェクトが参照として直列化)がありますが、クライアントアプリケーションがそれをデシリアライズすることができますことを確認する必要があります。

{ 「ID」:「1」、 「名前を「: "ジョン"、 "友人":[ { "ID": "2"、 "名": "ジャレッド"、 "友人":[ { "$ refを": "1" } ] } }

ループの原因となる属性(@JsonIgnore)を持たない親オブジェクトをシリアル化することです。残りの部分をシリアライズし、クライアントアプリケーションでオブジェクトを作成し直します。ジャクソンのhttp://www.baeldung.com/jackson-bidirectional-relationships-and-infinite-recursion

+0

これは周期的な参照を使ってオブジェクトを直列化するための良いアドバイスですが、OPは別の問題である*スキーマ生成*中に無限再帰を求めています。 – dnault

関連する問題