MongoDB保存操作失败的JSF视图和ObjectID

MongoDB保存操作失败的JSF视图和ObjectID,mongodb,jsf,primefaces,Mongodb,Jsf,Primefaces,免责声明:我是JSF新手,但仍然找不到任何其他问题来帮助我解决这个问题 我在JSF中有一个CRUD视图(如果这很重要的话,更具体地说是在primefaces对话框中),当我长时间使用ID时,它工作得很好,但当我使用ObjectID作为ID时(我使用ObjectID,因为Morphia会在使用ObjectID时自动生成ID) 发生的情况是ObjectID向下传输到视图并显示良好,但当我单击save时,不会发生任何事情(保存方法中不会命中断点,控制台中也不会显示任何错误),如前所述,如果我使用一个长

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

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

发生的情况是ObjectID向下传输到视图并显示良好,但当我单击save时,不会发生任何事情(保存方法中不会命中断点,控制台中也不会显示任何错误),如前所述,如果我使用一个长ID,则效果良好

这是ObjectID的输入字段和save按钮的操作(当save方法返回空ObjectID时,我显示ObjectID,如果不显示,则只创建一条新记录)


//所选驱动器的类型
@com.google.code.morphia.annotations.Entity
等级经销商{
@com.google.code.morphia.annotations.Id
@属性//在XTend中生成getter和setter
org.bson.types.ObjectId;
}

我的猜测是它在反序列化ObjectID时遇到了问题(虽然控制台中没有错误消息),但我对JSF了解不够,不知道从哪里开始,任何帮助都将不胜感激。

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

@facescoverter(“objectId”)
类ObjectdConverter实现转换器{
def对象getAsObject(FacesContext上下文、UIComponent组件、,
字符串值){
如果(value==null | |“”.equals(value)| | value.size()<10){
返回空
}
返回新的ObjectId(值)
}
def字符串getAsString(FacesContext上下文、UIComponent、,
对象值){
如果(值==null){
返回空
}
if(ObjectId的值instanceof){
返回值(值为ObjectId).toString()
}否则{
抛出新的IllegalArgumentException(“无法在KeyConverter中转换“+值+”);
}
}
}

您遇到转换错误。这很可能是因为您在页面的后台bean中绑定的类型与
selectedDealer.id
的实际类型不匹配。该变量的类型是什么?类型是org.bson.types.ObjectId,据我所知,使用该类型可以帮助MongoDB自动生成id。我将更新我的上述评论。在JSF town中这种方式不起作用。如果自定义类型不是字符串或基元,则必须显式声明其转换语义。看见
<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;
}
@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" );
        }
    }
}