Wicket LambdaModel 和 NumberTextField 无法解析类型

Wicket LambdaModel and NumberTextField cannot resolveType

在我的 Wicket 8 应用程序中的一个表单中切换到 LambdaModel 作为 PropertyModel 的替代方案后,我提交测试失败,说明:

java.lang.ClassCastException: java.lang.String cannot be cast to java.math.BigDecimal

我的表单面板有一个 NumberTextField,在我的 working 场景中绑定到 PropertyModel.

这行得通

form.add(new NumberTextField<BigDecimal>("myBigDecimalField", new PropertyModel<>(getModel(), "myBigDecimalField")));

这行不通

form.add(new NumberTextField<BigDecimal>("myBigDecimalField", LambdaModel.of(getModel(), MyClass::getMyBigDecimalField, MyClass::setMyBigDecimalField)));

问题是 LambdaModel 没有像 PropertyModel 那样实现 IObjectClassAwareModel,因此当 NumberTextField 试图解析 AbstractTextComponent#152 中的类型时,随后检查 getModelType 如果模型是 IObjectClassAwareModel 的实例它将不起作用,因为 LambdaModel 没有实现此接口。

这是为了LamdaModel不实现IObjectClassAwareModel。 顺便说一句,我知道我可以通过显式声明 NumberTextField.

的类型 class 来解决这个问题

遗憾的是,很难从 lambda 中检索任何类型信息。

请看这里的解释:

Java: how to resolve generic type of lambda parameter?

所以现在建议将类型传递给组件。