Spring MongoDB - использовать абстрактное / запечатанное поле класса - PullRequest
0 голосов
/ 03 декабря 2018
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;
}

Как мне добиться такого поведения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...