无法将客户端值“null”转换回服务器端对象

时间:2013-04-09 07:24:30

标签: java tapestry

此问题与Tapestry组件问题有关。

我正在寻找完全解决此问题的解决方案,而不是任何解决方法或替代方法,如何实现此接口。

  1. 考虑ajaxformloop表单上的Tapestry元素:

    <tr t:type="ajaxformloop" t:id="items" source="getItems()" value="item">

    ...

    </tr>

  2. 类中的
  3. getItems()方法返回持久对象和尚未保留的新添加项的合成组合(List接口)(其中包含null id)。< / p>

  4. 提交表单时,我收到此错误:

    Unable to convert client value 'null' back into a server-side object

  5. onSuccessFromSave()方法之前发生此错误(save是提交链接的ID)。

    我想知道,如何使用ajaxformloop管理此类不存在的对象以防止此类错误。实际上,我想在我的onSucceccFrom...()方法中保存(在DB中)这些项目。

    我在这里错过了什么?

1 个答案:

答案 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();
    }
};