getAsObject 字符串值为单词 null
getAsObject string value is the word null
我有以下 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>
select "Add Transaction Type" 的项目只是在单击时打开一个对话框,如果离开 selected 并且提交了表单,它将向转换器发送“-1”。
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));
}
}
我的问题是,当我 select 列表中的某些内容时,getAsObject 被调用两次,首先是字符串 id,然后是值为 null 的字符串(即 String s = "null").这当然不难检查和处理,但我更感兴趣的是为什么会这样。 getAsObject 的 javadocs 只说该值可以为空,而不是 "null"。我在其他项目中也有没有这个问题的转换器,我看不出有什么不同会导致它。
编辑:
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();
}
}
这是 运行ning 在 Java 1.6、Tomcat 7、JSF 2.1、Primefaces 5.0 上,尽管它在 Java 1.8 上也有 运行同样的问题。
好的,我找到了第二个方法调用的原因。
在同一页面上,我有 3 个默认隐藏的对话框。其中之一
还有一个使用相同转换器的 selectOneMenu,但它没有正确填充,因此如果不使用此对话框,它的默认值是 "null"。当然,在提交表单时,即使未使用该值,它仍然必须通过转换器,这就是第二个方法调用的来源。
参考有问题的 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>
我有以下 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>
select "Add Transaction Type" 的项目只是在单击时打开一个对话框,如果离开 selected 并且提交了表单,它将向转换器发送“-1”。 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));
}
}
我的问题是,当我 select 列表中的某些内容时,getAsObject 被调用两次,首先是字符串 id,然后是值为 null 的字符串(即 String s = "null").这当然不难检查和处理,但我更感兴趣的是为什么会这样。 getAsObject 的 javadocs 只说该值可以为空,而不是 "null"。我在其他项目中也有没有这个问题的转换器,我看不出有什么不同会导致它。
编辑: 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();
}
}
这是 运行ning 在 Java 1.6、Tomcat 7、JSF 2.1、Primefaces 5.0 上,尽管它在 Java 1.8 上也有 运行同样的问题。
好的,我找到了第二个方法调用的原因。
在同一页面上,我有 3 个默认隐藏的对话框。其中之一 还有一个使用相同转换器的 selectOneMenu,但它没有正确填充,因此如果不使用此对话框,它的默认值是 "null"。当然,在提交表单时,即使未使用该值,它仍然必须通过转换器,这就是第二个方法调用的来源。
参考有问题的 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>