Gremlin 驱动程序无法反序列化来自运行 Bitsy 数据库的 Germlin 施维雅的响应



我正在使用 github 存储库 (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))
}

我的毕业生的相关部分:

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.+")
}

为什么驱动程序无法反序列化来自服务器的消息?我应该更改什么以允许它?

我不完全确定,但我猜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()

最新更新