2

私のスキーマには、次のような抽象クラスがあります。

@JsonAutoDetect(JsonMethod.NONE)
public abstract class AbstractEntity {

    @Id private Object id;
    @Version private Integer version;

    public AbstractEntity() {}

    @JsonProperty // this annotation causes infinite recursion
    public Object getId() { return id; }

}

このクラスは、すべてのエンティティのスーパークラスとして使用されます。次に例を示します。

@JsonAutoDetect(JsonMethod.NONE)
public class Usuario extends AbstractEntity {

    private Cadastro cadastro;

    protected Usuario() {}

    public Usuario(Cadastro cadastro) {
        setCadastro(cadastro);
    }

    @JsonProperty
    public Cadastro getCadastro() { return cadastro; }

    @JsonProperty
    public void setCadastro(Cadastro cadastro) { this.cadastro = cadastro; }

}

ユーザーが JSON 要求/応答を介して db にレコードを作成できるようにする REST レイヤーを設計しています。

@POST
@Path("cadastrar")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response cadastrar(@Context HttpServletRequest request, Cadastro cadastro) {
    OObjectDatabaseTx bd = (OObjectDatabaseTx) request.getAttribute("object.database.tx");

    try {

        bd.begin();
        Usuario usuario = new Usuario(cadastro);
        usuario = bd.save(usuario);
        bd.commit();

        String json = new ObjectMapper().writeValueAsString(usuario);
        Response response = Response.status(HttpURLConnection.HTTP_CREATED).entity(json).build();

        return response;
        (...)

ただし、この最後のメソッドでは、Jackson を呼び出して (writeValueAsStringメソッド内で) 新しく作成したエンティティをシリアル化すると、無限再帰が発生します。

org.codehaus.jackson.map.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain:
  com.orientechnologies.orient.core.id.ORecordId["record"]->com.orientechnologies.orient.core.record.impl.ODocument["identity"]
->com.orientechnologies.orient.core.id.ORecordId["record"]->com.orientechnologies.orient.core.record.impl.ODocument["identity"]
->com.orientechnologies.orient.core.id.ORecordId["record"]->com.orientechnologies.orient.core.record.impl.ODoc...

クラスのメソッド@JsonPropertyから削除することで、無限再帰を回避できます。ただし、この方法では、プロパティは JSON 応答に存在しません。getIdAbstractEntityid

idでは、どうすればプロパティをシリアル化できますか?

ありがとう!

4

1 に答える 1

2

ジャクソンは循環参照をサポートしていますか?そうですか?

于 2013-02-13T10:10:57.193 に答える