我有两个.xhtml页面,每个页面都包含一个表单,用于输入所选对象的数据。它们只在要选择的对象上有所不同。
第一页:
<h:outputText value="Buchung:"/>
<h:selectOneMenu converter="#{orderConverter}" value="#{reportBean.selectedOrder}" valueChangeListener="#{reportBean.valueChange}">
<f:selectItems value="#{orderBean.privateOrderList}" var="order" itemValue="#{order.ID}"/>
<a4j:ajax event="valueChange" execute="@this"/>
</h:selectOneMenu>
第二页
<h:outputText value="Auto:"/>
<h:selectOneMenu converter="#{vehicleConverter}" value="#{orderBean.selectedVehicle}" valueChangeListener="#{orderBean.valueChange}">
<f:selectItems value="#{vehicleBean.vehicleList}" var="vehicle" itemValue="#{vehicle.licenseTag}"/>
<a4j:ajax event="valueChange" execute="@this"/>
</h:selectOneMenu>
两个backingBeans的valueChange方法基本相同:
ReportBean:
public void valueChange(ValueChangeEvent event){
if(null!=event.getNewValue()) {
selectedOrder = (Order) event.getNewValue();
}
}
OrderBean:
public void valueChange(ValueChangeEvent event){
if(null!=event.getNewValue()) {
selectedVehicle = (Vehicle) event.getNewValue();
}
}
如您所见,在显示之前转换对象,但转换只是来回转换。应该不是问题,
orderConverter for page 1 for Example:
@ManagedBean
@FacesConverter(value = "orderConverter")
public class OrderConverter extends GenericConverter implements Converter {
@Override
public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String s) {
int i = Integer.parseInt(s);
return OrderDAO.getInstance().findById(i);
}
@Override
public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object o) {
return o.toString();
}
}
vehicleConverter根据传递的字符串查找对象,而不是在之前将其解析为整数。 &#34; toString()&#34;方法在SelectOneMenu中对一些字符串进行重新标识以便识别,所以这不应该是问题。
然而,第2页触发valueChangeEvent而第1页没有触发!
我看到的唯一区别是&#34; itemValue&#34; f:selectItems的属性是第2页的字符串(车辆的licenseTag)和第1页的整数(订单ID)。这是否导致此事件无法触发?如果是这样,当我没有另外的订单标识时,我该如何解决这个问题?