Spring 带有 ReactiveMongoRepository 的数据:通用保存
Spring Data with ReactiveMongoRepository: generic saving
我想保存一些值包含泛型的文档。我经常收到 StackOferflowError
.
这是我的模型的片段class
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
))
你知道我该如何改正吗?
这是堆栈跟踪的 psrt:
java.lang.WhosebugError
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)
你可以这样做:
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 存储为完全限定名称。
我想保存一些值包含泛型的文档。我经常收到 StackOferflowError
.
这是我的模型的片段class
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
))
你知道我该如何改正吗?
这是堆栈跟踪的 psrt:
java.lang.WhosebugError
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)
你可以这样做:
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 存储为完全限定名称。