0

免责声明:我是 JSF 的新手,但仍然找不到任何其他问题来帮助我解决这个问题。

我在 JSF 中有一个 CRUD 视图(如果这很重要,更具体地说是在 primefaces 对话框中)当我将 ID 设为 long 时它工作正常,但是当我使用 ObjectID 作为 ID 时(我使用 ObjectID,因为 Morphia 会自动生成一个 ID如果使用 ObjectID)。

如前所述,如果我使用 long ID 这工作正常。

这是 ObjectID 的输入字段和保存按钮的操作(我显示 ObjectID,因为保存方法返回 null ObjectID,如果不这样做,则只创建一条新记录)。

<p:inputText value="#{dealerBean.selectedDealer.id}"
    style="display:none;"  />

<p:commandButton id="saveButton" value="Save" update="dealers"
    actionListener="#{dealerBean.save}"
    title="Save" type="Submit" oncomplete="dealerDialog.hide()">
</p:commandButton>

//type of selectedDealer
@com.google.code.morphia.annotations.Entity
class Dealer {
    @com.google.code.morphia.annotations.Id
    @Property //Generates getters and setter in XTend
    org.bson.types.ObjectId id;
}

我的猜测是,它在反序列化 ObjectID 时遇到了问题(尽管控制台中没有错误消息),但我对 JSF 的了解不够深入,无法知道从那里去哪里,任何帮助将不胜感激。

4

1 回答 1

0

感谢 kolossus 在上述编辑中的回答。这是我使用的代码(抱歉,它使用的是 groovy 而不是 Java)(由于 XTend 和验证的问题,我从 Xtend 切换到了 groovy)

@FacesConverter("objectId")
class ObjectIdConverter implements Converter {
    def Object getAsObject( FacesContext context, UIComponent component,
                               String value) {
        if(value == null || "".equals(value) || value.size() < 10) {
            return null
        }
        return new ObjectId(value)
    }

    def String getAsString(FacesContext context, UIComponent component,
                               Object value) {
        if(value == null){
            return null
        }
        if (value instanceof ObjectId) {
            return (value as ObjectId).toString()
        } else {
            throw new IllegalArgumentException( "Cannot convert "+ value +" in       KeyConverter" );
        }
    }
}
于 2013-01-23T06:19:30.420 回答