我在页面中使用以下下拉列表时遇到问题。详细地说,当我使用 selectOneMenu 并按下下面列出的按钮时,永远不会调用方法保存。它只是通过我用f:event定义的所有方法。从我的页面中删除 selectOneMenu 并再次按下保存按钮后,我的方法被调用没有任何问题。
<p:selectOneMenu id="unitList"
value="#{myController.userDTO.selectedUnitDTO}">
<f:selectItems value="#{myController.unitList}" var="unitList"
itemValue="#{unitList}" itemLabel="#{unitList.name}" />
</p:selectOneMenu>
下拉列表数据通过以下方法加载(注意:unitList已初始化)
public List<UnitDTO> getUnitList() {
return unitList;
}
我的bean有以下注释 @ManagedBean @ViewScoped
这是我的按钮:
<p:commandButton id="save" action="#{myController.save}" value="SAVE" />
更多信息,我注意到当我按下保存按钮时,永远不会调用 selectedUnitDTO 的设置器。
Primefaces版本:6.0
答案 0 :(得分:2)
当您使用对象时,JSF需要转换器,在本例中为p:selectonemenu
您可以添加下一个java类:
import java.util.List;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
@FacesConverter("converterUnitDTO")
public class ConverterUnitDTO implements Converter {
@Override
public UnitDTO getAsObject(FacesContext context, UIComponent component, String value) {
List<UnitDTO> unitsDTO = (List<UnitDTO>) context.getApplication().evaluateExpressionGet(context, "#{myController.unitList}", List.class);
for (UnitDTO unitDTO : unitsDTO)
if (unitDTO.toString().equals(value))
return unitDTO;
return null;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
try {
return value.toString();
} catch (Exception e) {
return "";
}
}
}
在你的xhtml中改为:
<p:selectOneMenu id="unitList"
value="#{myController.userDTO.selectedUnitDTO}" converter="converterUnitDTO">
<f:selectItems value="#{myController.unitList}" var="unitList"
itemValue="#{unitList}" itemLabel="#{unitList.name}" />
</p:selectOneMenu>