Primefaces selectOneMenu阻止Bean

时间:2017-02-03 07:57:18

标签: jsf primefaces

我在页面中使用以下下拉列表时遇到问题。详细地说,当我使用 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

1 个答案:

答案 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>