OK. Parece um bug que acabei de consertar. Você pode tentar novamente com 0.106-Snapshot e ver se ainda erra assim?
Morphia - Erro de serialização ao atualizar o objeto com lista de referências
Pergunta
Eu tenho uma árvore de objetos aninhados que estou economizando para Mongo com a Morphia. Para salvar a árvore, primeiro salvo o objeto pai, depois salvo os filhos e atualizo os pais com uma lista de referências aos filhos. Recebo "Erro: não posso serializar serializando o clusteringNode de classe" ao executar a atualização, mesmo que o salvamento dos objetos individuais seja bem -sucedido. Tentei adicionar interface serializável e isso não ajudou. Aqui está o código:
@Entity
public class ClusteringNode {
@Id
private ObjectId id;
@Reference
private ClusteringNode parent;
@Reference
private List<ClusteringNode> children;
}
saveMethod() {
ClusteringNode node = new ClusteringNode();
node.setName("parent");
getDatastore().save(node);
List<ClusteringNode> children = new ArrayList<>();
ClusteringNode c1 = new ClusteringNode();
c1.setName("c1");
c1.setParent(node);
getDatastore().save(c1);
children.add(c1);
ClusteringNode c2 = new ClusteringNode();
c2.setName("c2");
c2.setParent(node);
getDatastore().save(c2);
children.add(c2);
Query<ClusteringNode> updateQuery = getDatastore().createQuery(ClusteringNode.class).field("_id").equal(node.getId());
// Tried both set() and addAll(), get the same result
// UpdateOperations<ClusteringNode> ops = getDatastore().createUpdateOperations(ClusteringNode.class).addAll("children", children,false);
UpdateOperations<ClusteringNode> ops = getDatastore().createUpdateOperations(ClusteringNode.class).set("children", children);
getDatastore().update(updateQuery, ops);
}
Aqui está o rastreamento da pilha:
java.lang.IllegalArgumentException: can't serialize class edu.harvard.iq.text.model.ClusteringNode
at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:273)
at org.bson.BasicBSONEncoder.putIterable(BasicBSONEncoder.java:298)
at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:237)
at org.bson.BasicBSONEncoder.putMap(BasicBSONEncoder.java:313)
at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:235)
at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:174)
at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:120)
at com.mongodb.DefaultDBEncoder.writeObject(DefaultDBEncoder.java:27)
at com.mongodb.OutMessage.putObject(OutMessage.java:289)
at com.mongodb.OutMessage.writeUpdate(OutMessage.java:175)
at com.mongodb.OutMessage.update(OutMessage.java:62)
at com.mongodb.DBApiLayer$MyCollection.update(DBApiLayer.java:325)
at com.mongodb.DBCollection.update(DBCollection.java:178)
at org.mongodb.morphia.DatastoreImpl.update(DatastoreImpl.java:1142)
at org.mongodb.morphia.DatastoreImpl.update(DatastoreImpl.java:1100)
at org.mongodb.morphia.DatastoreImpl.update(DatastoreImpl.java:1106)
at org.mongodb.morphia.DatastoreImpl.update(DatastoreImpl.java:999)
at edu.harvard.iq.text.model.NodeHierarchyTest.verySimpleTest(NodeHierarchyTest.java:116)
Se, em vez de addall (), adiciono cada objeto individualmente, ele funciona:
UpdateOperations<ClusteringNode> ops = getDatastore().createUpdateOperations(ClusteringNode.class).add("children", children.get(0));
getDatastore().update(updateQuery, ops);
ops = getDatastore().createUpdateOperations(ClusteringNode.class).add("children", children.get(1));
getDatastore().update(updateQuery, ops);
Solução
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow