Primefaces selectOneMenu 阻止 Bean 中的方法调用



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

下拉列表数据通过以下方法加载(注意。 单位列表已初始化)

public List<UnitDTO> getUnitList() {
    return unitList;
}

我的豆子有以下注释@ManagedBean @ViewScoped

这是我的按钮:

<p:commandButton id="save" action="#{myController.save}" value="SAVE"  />

进一步的信息,我注意到当我按下保存按钮时,永远不会调用 selectedUnitDTO 的设置器。

总理版本:6.0

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>

最新更新