我想基于反射来动态生成Vaadin 8 TextField。至少应支持String
,Double
和Integer
。
为避免重复的代码进行bean验证,应根据类型选择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
}