此问题与Tapestry
组件问题有关。
我正在寻找完全解决此问题的解决方案,而不是任何解决方法或替代方法,如何实现此接口。
考虑ajaxformloop
表单上的Tapestry
元素:
<tr t:type="ajaxformloop" t:id="items" source="getItems()" value="item">
...
</tr>
getItems()
方法返回持久对象和尚未保留的新添加项的合成组合(List
接口)(其中包含null
id)。< / p>
提交表单时,我收到此错误:
Unable to convert client value 'null' back into a server-side object
onSuccessFromSave()
方法之前发生此错误(save
是提交链接的ID)。
我想知道,如何使用ajaxformloop
管理此类不存在的对象以防止此类错误。实际上,我想在我的onSucceccFrom...()
方法中保存(在DB中)这些项目。
我在这里错过了什么?
答案 0 :(得分:1)
实际上我错过了ValueEncoder
容器的自定义ajaxformloop
。提到的错误是由此组件的默认encoder
生成的。
自定义编码器应以这种方式设置:
<tr t:type="ajaxformloop" t:id="items" source="getItems()" value="item" encoder="itemEncoder">
其中itemEncoder
是java类中的@Property
注释字段:
@Property
private ValueEncoder<MyItem> itemEncoder = new ValueEncoder<MyItem>() {
@Override
public String toClient(MyItem value) {
return value.id != null ? value.id.toString() : "";
}
@Override
public MyItem toValue(String clientValue) {
if (clientValue != null && !clientValue.isEmpty()) {
Long id = Long.parseLong(clientValue);
return (MyItem) session.get(MyItem.class, id);
}
return new MyItem();
}
};