具有ReactiveMongoRepository的Spring数据:通用保存

时间:2019-11-19 13:05:22

标签: kotlin reactive-programming spring-data-mongodb spring-mongodb

我想保存一些包含通用值的文档。而且我不断收到StackOferflowError

这是我的模型课程的一部分

data class MyDocument {
    val errors: List<SomeError> = emptyList()
}

SomeError位于接口中,应通过不同类型的错误(包括ValidationError)来实现

interface SomeError

data class ValidationError<T: Any>(val objectType: KClass<T>, val objectId: String) : SomeError

我正在尝试使用非空错误列表保存对象(使用ReactiveMongoRespoitory):

myDocumentRepository.save(MyDocument(
     errors = listOf( 
     ValidationError<MyDocument>(objectType = MyDocument::class, objectId = "somedoc")) //as SomeError did not help
))

你知道我该如何纠正吗?

这是Stack跟踪的psrt:

 java.lang.StackOverflowError
at java.base/java.util.HashMap.putVal(HashMap.java:624)
at java.base/java.util.HashMap.putMapEntries(HashMap.java:510)
at java.base/java.util.HashMap.putAll(HashMap.java:780)
at org.springframework.data.util.TypeDiscoverer.resolveType(TypeDiscoverer.java:168)
at org.springframework.data.util.ParameterizedTypeInformation.calculateTypeVariables(ParameterizedTypeInformation.java:269)

1 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

import org.springframework.data.annotation.Transient

data class ValidationError private constructor(
  private val type: String,
  val objectId: String
) : SomeError {
  constructor(type: KClass<*>, objectId: String) : this(type.qualifiedName!!, objectId)

  @delegate:Transient
  val objectType by lazy {
    this.javaClass.classLoader.loadClass(type).kotlin
  }
}

将KClass内部存储为完全限定的名称。