【问题标题】:Neo4j OGM - Deserializing enum lists in KotlinNeo4j OGM - 在 Kotlin 中反序列化枚举列表
【发布时间】:2019-01-18 07:03:57
【问题描述】:

我正在尝试使用 Kotlin 在 Neo4j 数据库中存储和检索具有枚举列表的对象。使用枚举存储实体可以正常工作,但是将其反序列化回同一个枚举并不像我在 Kotlin 中尝试的那样工作。我正在使用螺栓驱动器。

enum class DayOfWeek { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY }

@NodeEntity
data class Weekend(
  @Id @GeneratedValue var id: Long? = null, 
  var days: List<DayOfWeek>? = null
)

fun main(args: Array<String>) {
  val config = Configuration.Builder()
    .uri("bolt://localhost:7687")
    .credentials("username", "password")
    .build()
  val sessionFactory = SessionFactory(config, "com.example.calendar")
  val session = sessionFactory.openSession()
  val weekend = session.load(Weekend::class.java, 10L)
  weekend.days?.forEach { print("The weekend consists of: $it") }
}

这样做只会引发异常:Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to com.example.calendar.DayOfWeek。用这个类在 Java 中做同样的事情可以正常工作:

public class WeekendJ {
  @Id
  @GeneratedValue
  Long id;
  List<DayOfWeek> days;
  public WeekendJ() {
  }
  public WeekendJ(List<DayOfWeek> days) {
    this.days = days;
  }
}

我的 POM:

<dependency>
  <groupId>org.neo4j</groupId>
  <artifactId>neo4j-ogm-core</artifactId>
  <version>3.1.5</version>
  <scope>compile</scope>
</dependency>

<dependency>
  <groupId>org.neo4j</groupId>
  <artifactId>neo4j-ogm-bolt-driver</artifactId>
  <version>3.1.5</version>
  <scope>runtime</scope>
</dependency>

<dependency>
  <groupId>org.jetbrains.kotlin</groupId>
  <artifactId>kotlin-stdlib-jdk8</artifactId>
  <version>1.3.11</version>
</dependency>

我是否遗漏了一些明显的东西? Kotlin 怎么解决这个问题?

【问题讨论】:

    标签: kotlin neo4j neo4j-ogm neo4j-ogm-bolt-driver


    【解决方案1】:

    我遇到了同样的问题。不确定确切的根本原因,但它似乎是 OGM+Kotlin 中的一个错误。我用一个转换器修复了它,该转换器告诉 OGM 将其转换为字符串数组以存储在 Neo4J 中。像这样:

    标记您的财产以使用转换器:

    public class WeekendJ {
      @Id
      @GeneratedValue
      Long id;
    
      @Convert(DayOfWeekConverter::class)
      List<DayOfWeek> days;
    
      public WeekendJ() {
      }
      public WeekendJ(List<DayOfWeek> days) {
        this.days = days;
      }
    }
    

    转换器:

    class DayOfWeek : AttributeConverter<Set<DayOfWeek>, Array<String>> {
        override fun toGraphProperty(days: Set<DayOfWeek>): Array<String> =
                days.map { it.name }.toTypedArray()
    
        override fun toEntityAttribute(dayNames: Array<String>): Set<DayOfWeek> =
                dayNames.map { DayOfWeek.valueOf(it) }.toSet()
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-31
      • 2015-07-26
      • 1970-01-01
      • 2021-11-30
      • 1970-01-01
      • 2014-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多