Kotlin中的Wicket NumberTextField在提交时抛出ClassCastException

我在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) } } 

提交表单后,我得到以下堆栈跟踪:

java.lang.ClassCastException:无法将java.lang.String转换为com.mycompany.test.pages.Test处的java.lang.Number $ onInitialize $ 1.onSubmit(Test.kt:28)at org.apache.wicket.markup .html.form.Form.delegateSubmit(Form.java:1312),位于org.apache.wicket.markup.html.form的org.apache.wicket.markup.html.form.Form.process(Form.java:979) .Form.onFormSubmitted(Form.java:802)at org.apache.wicket.markup.html.form.Form.onRequest(Form.java:715)at org.apache.wicket.core.request.handler.ListenerRequestHandler.internalInvoke (ListenerRequestHandler.java:301)at org.apache.wicket.core.request.handler.ListenerRequestHandler.invoke(ListenerRequestHandler.java:250)at 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)at org.apache.wicket.request.Reques tHandlerExecutor.execute(RequestHandlerExecutor.java:65)在org.apache.wicket.request.cycle.RequestCycle.execute(RequestCycle.java:283)at org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java: 253)org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:221)at org.apache.wicket.protocol.http.WicketFilter.processRequestCycle(WicketFilter.java:262)at org.apache.wicket .protocol.http.WicketFilter.processRequest(WicketFilter.java:204)at 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。

我和我的同事们试图以我们所能想象到的方式来改变模型的类型签名,但却无法解决。 由于Kotlins Int被表示为一个原始类型(从文档:“在JVM上,这种类型的非空值被表示为基本类型int的值”),所以同事建议编写一个定制的Wicket转换器。虽然我不知道这是否会起作用,但对我来说似乎是一种矫枉过正。

我可以想到的另一个黑客:编写一些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) 

由于类型擦除您的NumberTextField无法检测您的模型的泛型类型参数。 由于你的模型对象是null,所以它不能用来派生类型。

在这种情况下,Wicket假设一个String模型对象类型:/。

可以将类型明确地提供给NumberTextField,或者使用保存其通用信息的模型,例如PropertyModel。

Interesting Posts