sealed class Entity
data class Bacteria(
val uid: String,
val rank: String,
val division: String,
val scientificname: String,
val commonname: String
): Entity()
data class CTDDisease(
val diseaseId: String,
val name: String,
val altDiseaseIds: List<String>,
val parentIds: List<String>,
val definition: String?
) : Entity()
И затем я хочу определить свой документ как
@Document(collection = "annotations")
data class Annotation(
@Id val id: String,
...
val spans: List<AnnotationSpan>
)
data class AnnotationSpan(
val startIndex: Int,
val endIndex: Int,
val entity: Entity? // Can be Bacteria or Disease or null
)
. Я также принимаю время от времени эти 2 класса в пределах RequestBody
от клиента, например,
@PutMapping("/annotations")
fun submitAnnotations(@RequestBody submission: Submissions): Mono<Void> { ... }
data class Submission(val annotations: List<AnnotationSpan>, ...) // AnnotationSpan contains Entity
но я получаю
java.lang.IllegalAccessException: class kotlin.reflect.jvm.internal.calls.CallerImpl$Constructor cannot access a member of class com.package.name.Entity with modifiers "private"
Если я изменю класс Entity
на абстрактный класс
abstract class Entity
, тогда я не получаю сообщение об ошибке, но мои операции запроса продолжают выполнятьсянавсегда.
Bacteria
и Disease
имеют разные поля, поэтому они должны быть различимы.
Я попытался использовать хакерский конвертер
@ReadingConverter
class NormalizedEntityReaderConverter: Converter<DBObject, NormalizedEntity> {
override fun convert(source: DBObject): NormalizedEntity? {
println(source.toString())
val gson = Gson()
return gson.runCatching { fromJson(source.toString(), CTDDisease::class.java) }.getOrNull()
?: gson.runCatching { fromJson(source.toString(), Bacteria::class.java) }.getOrNull()
}
}
и затем зарегистрировал егонапример,
@Configuration
class MongoConverterConfig {
@Bean
fun customConversions(): MongoCustomConversions {
val normalizedEntityReaderConverter = NormalizedEntityReaderConverter()
val converterList = listOf<Converter<*, *>>(normalizedEntityReaderConverter)
return MongoCustomConversions(converterList)
}
}
Мой конвертер работает при вызове вручную, но по какой-то причине Spring по-прежнему его не берет.
Я новичок в Spring.Я бы достиг этой функциональности на своем сервере Node.js, используя типы объединения в TypeScript, например
interface AnnotationSpan {
startIndex: number;
endIndex: number;
entity?: Bacteria | Disease;
}
Как мне добиться такого поведения?