我在Kotlin(1.1.0)中遇到Wicket(8.0.0-M4)NumberTextField的问题。
我的精简版表格如下:
class Test : AbstractWebPage() {
val housenumberModel: Model<Int> = Model<Int>()
val housenumber = NumberTextField<Int>("housenumberModel", housenumberModel)
val form: Form<Unit> = object : Form<Unit>("adressForm") {}
override fun onInitialize() {
super.onInitialize()
form.add(housenumber.setRequired(false))
form.add(object : SubmitLink("submit") {
override fun onSubmit() {
super.onSubmit()
println(housenumberModel.`object`) // this is line 28
}
})
add(form)
}
}
提交表单后,我得到以下stacktrace:
java.lang.ClassCastException:java.lang.String无法强制转换为 java.lang.Number中 在com.mycompany.test.pages.Test $ onInitialize $ 1.onSubmit(Test.kt:28) 在org.apache.wicket.markup.html.form.Form.delegateSubmit(Form.java:1312) 在org.apache.wicket.markup.html.form.Form.process(Form.java:979) 在org.apache.wicket.markup.html.form.Form.onFormSubmitted(Form.java:802) 在org.apache.wicket.markup.html.form.Form.onRequest(Form.java:715) 在org.apache.wicket.core.request.handler.ListenerRequestHandler.internalInvoke(ListenerRequestHandler.java:301) 在org.apache.wicket.core.request.handler.ListenerRequestHandler.invoke(ListenerRequestHandler.java:250) 在org.apache.wicket.core.request.handler.ListenerRequestHandler.invokeListener(ListenerRequestHandler.java:210) 在org.apache.wicket.core.request.handler.ListenerRequestHandler.respond(ListenerRequestHandler.java:203) at org.apache.wicket.request.cycle.RequestCycle $ HandlerExecutor.respond(RequestCycle.java:912) 在org.apache.wicket.request.RequestHandlerExecutor.execute(RequestHandlerExecutor.java:65) 在org.apache.wicket.request.cycle.RequestCycle.execute(RequestCycle.java:283) 在org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:253) at org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:221) 在org.apache.wicket.protocol.http.WicketFilter.processRequestCycle(WicketFilter.java:262) 在org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:204) 在org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:286) [...]
如果我使用
val housenumberModel: Model<Int> = Model.of(0)
而不是
val housenumberModel: Model<Int> = Model<Int>()
一切正常。但由于我的NumberTextField是可选的,我不想让它预先初始化为0。
我和我的同事们试图以我们可以想象的各种方式改变模型的类型签名但是没有解决方案。一位同事建议编写一个自定义Wicket转换器,因为Kotlins Int被表示为基本类型(来自文档:&#34;在JVM上,此类型的非可空值表示为基本类型int的值。 &#34;)即使我不知道这是否有效,但对我来说这似乎有点过头了。
我能想到的另一个黑客:编写一些JavaScript来从输入字段中删除零。也不是我想做的事情。
问题:我的问题有一个简单的解决方案吗?
(并且作为一个额外的问题:已经有人在Kotlin写了一个更大的Wicket应用程序并且可以告诉我这个组合是否准备好黄金时间用这个堆栈开发一个关键项目或者我的问题只是提示冰山?)
[编辑]
svenmeier指出的解决方案:
使用
val housenumber = NumberTextField<Int>("housenumberModel", housenumberModel, Int::class.java)
作品。
或作为替代方案:
val housenumbervalue: Int? = null
val housenumberModel: IModel<Int> = PropertyModel<Int>(this, "housenumbervalue")
val housenumber = NumberTextField<Int>("housenumberModel", housenumberModel)
答案 0 :(得分:3)
由于类型擦除,您的NumberTextField无法检测模型的泛型类型参数。由于您的模型对象为null,因此它不能用于派生类型。
在这种情况下,Wicket采用String模型对象类型:/。
要么明确地向NumberTextField提供类型,要么使用保留其通用信息的模型,例如:一个PropertyModel。
答案 1 :(得分:0)
有一种方法可以告诉 wicket 你想要的类型,它是通过在构造函数中添加类型。更多here。
在 Java 中是这样的:
new NumberTextField<Integer>("housenumberModel", housenumberModel, Integer.class);