getAsObject字符串值是单词null

时间:2017-06-23 08:43:50

标签: java primefaces jsf-2

我有以下selectOneMenu:

<p:outputLabel value="Transaction Type:"/>
<p:selectOneMenu value="#{accountFormBean.account.transType}" converter="#{transTypeConverter}" onchange="changedValue(this)" filter="true" filterMatchMode="startsWith">
    <f:selectItems value="#{accountFormBean.transTypeList}" var="tType" itemValue="#{tType}" itemLabel="#{tType.transTypeName}" />
    <f:selectItem itemLabel="Add Transaction Type" itemValue="#{accountFormBean.dialogSelectTransType}"/>
</p:selectOneMenu>

selectItem for&#34; Add Transaction Type&#34;单击时只打开一个对话框,如果选中该对话框并提交表单,它将发送&#34; -1&#34;到转换器。 TransTypeConverter getAsObject方法如下:

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
    TransType dummy = new TransType();
    dummy.setTransTypeId(-1L);

    if(value.equals("-1")) {
        return dummy;
    } else if (value.equalsIgnoreCase("null")) {
        return null;
    } else {
        return transTypeManager.getTransType(Long.parseLong(value));
    }
}

我的问题是当我在列表中选择一些东西时,getAsObject被调用两次,首先是字符串id,然后是字符串null的字符串(即String s =&#34; null&#34; )。这当然不难检查和处理,但我更感兴趣的是为什么会发生这种情况。 getAsObject的javadoc只表示值可以为null,而不是&#34; null&#34;。我也有其他没有这个问题的项目的转换器,我看不出会导致它的任何差异。

编辑: changedValue()函数:

function changedValue(element){
    var transVal = $(element).find('option:selected').text();
    if(transVal === "Add Merchant"){
        PF('merchantDialog').show();
    }

    if(transVal === "Add Transaction Type"){
        PF('transTypeDialog').show();
    }

    if(transVal === "Add Payment Type"){
        PF('paymentTypeDialog').show();
    }

}

这是在Java 1.6,Tomcat 7,JSF 2.1,Primefaces 5.0上运行的,虽然它也在Java 1.8上运行同样的问题。

1 个答案:

答案 0 :(得分:0)

好的,所以我找到了第二次方法调用的原因。

在同一页面上,我有3个默认隐藏的对话框。其中之一 还有一个selectOneMenu使用相同的转换器,但它没有正确填充,因此如果没有使用此对话框,则默认值为&#34; null&#34;。当然,在表单提交时,即使没有使用该值,它仍然必须通过转换器,这是第二个方法调用的来源。

参考有问题的selectOneMenu:

<p:selectOneMenu id="transTypeDiaId" value="#{merchantFormBean.merchant.transType}" onchange="changedValue(this)" converter="#{transTypeConverter}" filter="true" filterMatchMode="startsWith">
    <f:selectItems value="#{merchantFormBean.dropdownTransTypes}" var="type" itemLabel="#{type.transTypeName}" itemValue="#{type}" />
    <f:selectItem itemLabel="Add Transaction Type" itemValue="#{merchantFormBean.dialogSelect}"/>
</p:selectOneMenu>