Neo4j OGM - десериализация списков перечислений в Kotlin - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь сохранить и получить объект, имеющий список enum, в базе данных Neo4j с Kotlin. Хранение сущности с перечислением работает нормально, но десериализация его обратно к тому же перечислению не работает так, как я пытаюсь в 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;
  }
}

Мое ПОМ:

<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>

Я что-то упускаю из виду? Как вы решите, что это Котлин?

1 Ответ

0 голосов
/ 20 мая 2019

Я столкнулся с этой же проблемой. Не уверен в точной основной причине, но это похоже на ошибку в OGM + Kotlin. Я исправил это с помощью конвертера, который сказал OGM преобразовать его в массив String для хранения в 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()
}
...