我正在使用 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()