私のスキーマには、次のような抽象クラスがあります。
@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 応答に存在しません。getId
AbstractEntity
id
id
では、どうすればプロパティをシリアル化できますか?
ありがとう!