【发布时间】:2017-06-23 08:43:50
【问题描述】:
我有以下 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 意味着单击时会打开一个对话框,如果保持选中状态并提交表单,它将向转换器发送“-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));
}
}
我的问题是,当我在列表中选择某些内容时,getAsObject 被调用了两次,首先是字符串 id,然后是字符串,其值为 null(即 String s = "null")。这当然不难检查和处理,但我更感兴趣的是为什么会发生这种情况。 getAsObject 的 javadocs 只说该值可以为空,而不是“空”。我在其他项目中也有没有这个问题的转换器,我看不出有什么不同会导致它。
编辑: 改变值()函数:
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 上运行,但存在同样的问题。
【问题讨论】:
-
为什么是
converter="#{transTypeConverter}"而不是converter="transTypeConverter"?它也是托管 bean 吗? -
@MicheleMariotti Spring 在此项目中用于依赖注入,因此使用了
@Component和@FacesConverter("transTypeConverter")。我将做一个快速测试,看看使用converter="transTypeConverter"是否有效,因为我不确定它是否有效(不是原始开发人员)。 -
我怀疑它是否相关。您是否从
changedValueJS 函数触发表单提交/对话框显示?您也应该发布该功能。您是否遇到了双重提交,或者只是同一请求中的双重方法调用? -
@MicheleMariotti 表单提交是通过
p:commandButton,来自changedValue的对话框显示,将添加到我的问题。这似乎是双重方法调用,只有一个提交,但我想我已经找到了问题,如果我找到了,我会作为答案发布。
标签: java primefaces jsf-2