微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Neo4J弹簧靴在 kotlin 中带有密封类

如何解决Neo4J弹簧靴在 kotlin 中带有密封类

我正在尝试使用 kotlin 和 neo4j 创建一个有点通用的实现。我现在的想法是我想要一个 GeoNode 可以指向任何类型的 GeoJson 特征(例如“Feature”或“FeatureCollection”)

我尝试使用 kotlins 密封类来做到这一点,例如


@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME,include = JsonTypeInfo.As.PROPERTY,property = "type"
)
@JsonSubTypes(
    JsonSubTypes.Type(value = GeoJsonFeature::class,name = "GeoJsonFeature")
)
@Node
sealed class FeatureContract(
    @GeneratedValue @Id var id: Long? = null,@Version var version: Long? = null
) {
    companion object {
        @JsonCreator
        @JvmStatic
        private fun creator(name: String): FeatureContract? {
            return FeatureContract::class.sealedSubclasses.firstOrNull {
                it.simpleName == name
            }?.objectInstance
        }

    }
}

data class GeoJsonFeature(
    val geometry: GeometryContract,) : FeatureContract()


data class GeoJsonFeatureCollection(
    val features: List<GeoJsonFeature>,) : FeatureContract()


// and the "GeoNode" that holds this

@Node
data class GeoNode(
    @Id val id: String,@Version var version: Long? = null
    @Relationship(type = "feature") var feature: FeatureContract?,// Should be either a featureCollection or a feature,)

这个想法是我可以在地图上有一个点指向任何种类的 GeoJson。

似乎我成功地将其序列化并在写入时将其放入 Neo4J-db,但是,在读取时我得到

Failed to instantiate [FeatureContract]: Is it an abstract class?; nested exception is java.lang.InstantiationException

Jackson 注释在那里,因为我希望它们能帮助我(Neo4J-OGM 在幕后使用它)但它似乎没有成功。我读过关于 Neo4JEntityConverters 的文章,但我不明白如何为这样的完整对象做到这一点。有没有什么好方法可以在 kotlin 中使用带有 Neo4j-OGM 的密封类进行序列化和反序列化?

使用 spring boot 2.4.4 和 spring-boot-starter-data-neo4j

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。