Используя встроенный JanusGraph, я создаю службу REST, которая возвращает списки Vertex и Edge, но я бы хотел вернуть json, как это делает сервер gremlin.
Я попытался использовать MessageSerializer, но не могу преобразовать двоичный формат в json.
@RequestMapping("/search")
public String search(@RequestBody SearchOptions options) throws JsonProcessingException, SerializationException {
List<Object> data = new ArrayList<>();
Builder responseBuilder = getResponseBuilder(data);
List<Vertex> nodes;
List<Object> edges;
if (Strings.isNullOrEmpty(options.getText()) || Strings.isNullOrEmpty(options.getField())) {
nodes = g.V().limit(options.getLimit()).toList();
edges = g.V().limit(options.getLimit()).aggregate("node").outE().as("edge").inV().where(P.within("node"))
.select("edge").toList();
} else {
nodes = g.V().has(options.getField(), options.getText()).toList();
edges = g.V().has(options.getField(), options.getText()).aggregate("node").outE().as("edge").inV()
.where(P.within("node")).select("edge").toList();
}
data.add(nodes);
data.add(edges);
ResponseMessage response = responseBuilder.create();
ByteBufAllocator allocator = new PooledByteBufAllocator();
ByteBuf byteBuffer = ser.serializeResponseAsBinary(response, allocator);
byte[] bytes = byteBuffer.array();
String str = new String(bytes);
return str;
}
@Bean
public MessageSerializer messageSerializer() {
GryoMapper.Builder kryo = GryoMapper.build().addRegistry(JanusGraphIoRegistry.getInstance());
MessageSerializer serializer = new GryoMessageSerializerV1d0(kryo);
return serializer;
}
Я попытался использовать сопоставитель объектов Джексона, но получил эту ошибку -
[http-nio-8080-exec-10] ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception
org.apache.tinkerpop.shaded.jackson.databind.JsonMappingException: (was java.lang.IllegalStateException) (through reference chain: org.apache.tinkerpop.gremlin.driver.message.ResponseMessage["result"]->org.apache.tinkerpop.gremlin.driver.message.ResponseResult["data"]->java.util.ArrayList[0]->java.util.ArrayList[0]->org.janusgraph.graphdb.relations.RelationIdentifier["inVertexId"])
at org.apache.tinkerpop.shaded.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:388)
Я определяю ObjectMapper так:
ObjectMapper mapper = GraphSONMapper.build().version(GraphSONVersion.V2_0).create().createMapper();
К вашему сведению - это был правильный способ создания ObjectMapper.
private ObjectMapper mapper = GraphSONMapper.build()
.addRegistry(JanusGraphIoRegistry.getInstance())
.version(GraphSONVersion.V2_0).create().createMapper();