0

我正在使用 github repo ( https://github.com/lambdazen/bitsy/tree/master/src/test/resources/gremlin-server ) 中给出的 conf 和属性文件运行一个带有 bitsy 的 gremlin 服务器。当然,我已更改dbPath为适当的路径。

我的客户端是一个运行 gremlin 控制台的 kotlin 应用程序。执行导致字符串或映射值的查询没有问题,例如:

val encodedPasswd = getg().V().has("user", "login", login).values<String>("password").next()

但是,当尝试从查询中获取顶点时:

val user = getg().V().has("user", "login", login).next()

我收到反序列化错误:

[gremlin-driver-loop-1] WARN org.apache.tinkerpop.gremlin.driver.ser.AbstractGraphSONMessageSerializerV2d0 - Response [PooledUnsafeDirectByteBuf(ridx: 7446, widx: 7446, cap: 7446)] could not be deserialized by org.apache.tinkerpop.gremlin.driver.ser.AbstractGraphSONMessageSerializerV2d0.
org.apache.tinkerpop.shaded.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `org.apache.tinkerpop.gremlin.driver.message.ResponseMessage` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
 at [Source: (byte[])"{"requestId":"5e78c0ba-64d2-4b31-8b04-262c3fa2b3b8","status":{"message":"Error during serialization: Direct self-reference leading to cycle (through reference chain: com.lambdazen.bitsy.store.VertexBean[\"id\"])","code":599,"attributes":{"@type":"g:Map","@value":["stackTrace","org.apache.tinkerpop.gremlin.driver.ser.SerializationException: org.apache.tinkerpop.shaded.jackson.databind.exc.InvalidDefinitionException: Direct self-reference leading to cycle (through reference chain: com.lambdazen.bi"[truncated 6946 bytes]; line: 1, column: 2]
    at org.apache.tinkerpop.shaded.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67)
    at org.apache.tinkerpop.shaded.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1451)
    at org.apache.tinkerpop.shaded.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1027)
    at org.apache.tinkerpop.shaded.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1297)
    at org.apache.tinkerpop.shaded.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:326)
    at org.apache.tinkerpop.shaded.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:159)
    at org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONTypeDeserializer.deserialize(GraphSONTypeDeserializer.java:212)
    at org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONTypeDeserializer.deserializeTypedFromObject(GraphSONTypeDeserializer.java:86)
    at org.apache.tinkerpop.shaded.jackson.databind.deser.BeanDeserializerBase.deserializeWithType(BeanDeserializerBase.java:1178)
    at org.apache.tinkerpop.shaded.jackson.databind.deser.impl.TypeWrappedDeserializer.deserialize(TypeWrappedDeserializer.java:68)
    at org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4013)
    at org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3091)
    at org.apache.tinkerpop.gremlin.driver.ser.AbstractGraphSONMessageSerializerV2d0.deserializeResponse(AbstractGraphSONMessageSerializerV2d0.java:134)
    at org.apache.tinkerpop.gremlin.driver.handler.WebSocketGremlinResponseDecoder.decode(WebSocketGremlinResponseDecoder.java:50)
...

集群建设:

var cluster = Cluster.build()
    .serializer (
        GryoMessageSerializerV3d0 (
            GryoMapper.build()
                .addRegistry(BitsyIoRegistryV3d0.instance())
        )
    )
    .serializer (
        GraphSONMessageSerializerV3d0 (
            GraphSONMapper.build()
                .addRegistry(BitsyIoRegistryV3d0.instance())
            .create()
        )
    )
.create()

和遍历源构造:

fun getg() : GraphTraversalSource {
    return EmptyGraph.instance().traversal().withRemote(DriverRemoteConnection.using(cluster))
}

我的gradle的相关部分:

dependencies {
    ...
    implementation('org.apache.tinkerpop:gremlin-driver:3.3.4')
    implementation("com.lambdazen.bitsy:bitsy:3.1.0")
    implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.9.+")
}

为什么驱动程序不能反序列化来自服务器的消息?我要改变什么以允许它?

4

1 回答 1

1

我不完全确定,但我猜 Bitsy 缺乏对 GraphSON 3.0 的完全支持。如果您查看它的IoRegistry实现,它不会为 GraphSON 注册自定义序列化程序(仅用于 Gryo):

https://github.com/lambdazen/bitsy/blob/c0dd4b6c9d6dc9987d0168c91417eb04d80bf712/src/main/java/com/lambdazen/bitsy/BitsyIoRegistryV3d0.java

我认为这就是您收到序列化错误的原因。如果你切换到只使用 Gryo(这可能在某种程度上被推荐,因为你在使用 Kotlin 的 JVM 上)我想你不会遇到这个问题。

请注意,您的Cluster对象定义也没有按照您期望的方式进行配置。通过调用serializer()两次(即一次用于 Gryo,一次用于 GraphSON),您实际上会覆盖 Gryo 配置并简单地配置对象以使用 GraphSON。

所以,我认为你会这样做:

var cluster = Cluster.build()
    .serializer (
        GryoMessageSerializerV3d0 (
            GryoMapper.build()
                .addRegistry(BitsyIoRegistryV3d0.instance())
        )
    )
.create()
于 2019-01-07T15:12:05.777 回答