Я бы хотел генерировать текстовые поля Vaadin 8 динамически на основе отражения. String
, Double
и Integer
должны поддерживаться как минимум.
Чтобы избежать дублирования кода для проверки бина, конвертер Vaadin следует выбирать в зависимости от его типа, а затем добавить к BeanValidationBinder
, см. Код ниже.
Однако компилятор Kotlin, похоже, пропускает некоторую информацию о типе, когда я получаю сообщение об ошибке из заголовка.
Кто-нибудь имеет представление о том, как решить проблему или проблема решаема без дублирования кода вообще?
MWE:
private fun getComponentForField(field: PropertyDescriptor, validationBinder: BeanValidationBinder<out Any>): Component {
val label = field.name.capitalize()
val converter: Converter<*, *>
val component = when (field.readMethod.returnType) {
String::class.java -> {
converter = Converter.identity<String>()
TextField(label)
}
Int::class.java -> {
converter = StringToIntegerConverter("Please enter an integer value.")
TextField(label)
}
Double::class.java -> {
converter = StringToDoubleConverter("Please enter a double value.")
TextField(label)
}
else -> {
converter = Converter.identity<Date>()
TextField()
}
}
validationBinder
.forField(component)
.withConverter(converter)
.bind(field.name)
return component
}