Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
d解决了这个问题,因为JSF2.0不再明确要求将列表作为值。只要一个列表就足够了 <h:selectOneMenu value="#{bean.selectedWarehouse}"> <f:selectItem itemLabel="Choose one .." itemValue="#{null}" /> <f:selectItems value="#{bean.availableWarehouses}" var="warehouse" itemLabel="#{warehouse.name}" itemValue="#{warehouse}" /> </h:selectOneMenu> 私人仓库选择仓库; 可供安置的私人名单;_Jsf_Jsf 2_Converter_Selectonemenu - Fatal编程技术网

d解决了这个问题,因为JSF2.0不再明确要求将列表作为值。只要一个列表就足够了 <h:selectOneMenu value="#{bean.selectedWarehouse}"> <f:selectItem itemLabel="Choose one .." itemValue="#{null}" /> <f:selectItems value="#{bean.availableWarehouses}" var="warehouse" itemLabel="#{warehouse.name}" itemValue="#{warehouse}" /> </h:selectOneMenu> 私人仓库选择仓库; 可供安置的私人名单;

d解决了这个问题,因为JSF2.0不再明确要求将列表作为值。只要一个列表就足够了 <h:selectOneMenu value="#{bean.selectedWarehouse}"> <f:selectItem itemLabel="Choose one .." itemValue="#{null}" /> <f:selectItems value="#{bean.availableWarehouses}" var="warehouse" itemLabel="#{warehouse.name}" itemValue="#{warehouse}" /> </h:selectOneMenu> 私人仓库选择仓库; 可供安置的私人名单;,jsf,jsf-2,converter,selectonemenu,Jsf,Jsf 2,Converter,Selectonemenu,带有实体和标识符的JSF通用转换器示例: <p:selectOneMenu id="somItems" value="#{exampleBean.selectedItem}" converter="SelectItemToEntityConverter"> <f:selectItem itemLabel="< select item >" itemValue="#{null}"/> <f:selectItems value="#{exam

带有实体和标识符的JSF通用转换器示例:

<p:selectOneMenu id="somItems" value="#{exampleBean.selectedItem}" converter="SelectItemToEntityConverter">
    <f:selectItem itemLabel="< select item >" itemValue="#{null}"/>
    <f:selectItems value="#{exampleBean.availableItems}" var="item" itemLabel="${item.identifier}" itemValue="#{item}"/>
</p:selectOneMenu>
java

选择ItemToEntityConverter.java

@FacesConverter(value=“SelectItemToEntityConverter”)
公共类SelectItemToEntityConverter实现转换器{
@凌驾
公共对象getAsObject(FacesContext ctx、UIComponent comp、字符串值){
对象o=null;
if(!(value==null | | value.isEmpty()){
o=这个。GetSelectedItemAssentity(comp,value);
}
返回o;
}
@凌驾
公共字符串getAsString(FacesContext ctx、UIComponent comp、对象值){
字符串s=“”;
if(值!=null){
s=((ABaseEntity)值).getIdentifier().toString();
}
返回s;
}
私有ABaseEntity GetSelectedItemAssentity(UIComponent组件,字符串值){
a实体项=null;
List selectItems=null;
对于(uic组件uic:comp.getChildren()){
if(uic UISelectItems的uic实例){
Long itemId=Long.valueOf(值);
selectItems=(List)((UISelectItems)uic.getValue();
if(itemId!=null&&selectItems!=null&&selectItems.isEmpty()){
谓词谓词=i->i.getIdentifier().equals(itemId);
item=selectItems.stream().filter(谓词).findFirst().orElse(null);
}
}
}
退货项目;
}
}
和用法:

<p:selectOneMenu id="somItems" value="#{exampleBean.selectedItem}" converter="SelectItemToEntityConverter">
    <f:selectItem itemLabel="< select item >" itemValue="#{null}"/>
    <f:selectItems value="#{exampleBean.availableItems}" var="item" itemLabel="${item.identifier}" itemValue="#{item}"/>
</p:selectOneMenu>


非常感谢您的详细回答,它解决了我的问题!通用JSF实体转换器非常好!您好@BalusC,我已经实现了这个解决方案,它可以工作,但我只看到一个问题。如果我尝试将自定义转换器文件移动到一个单独的bean中,那么当我重新加载页面时,它会显示“Expression Error:找不到名为MyCustomCoverter的对象”。因此,此文本
无法找到转换器。现在,我该怎么做呢?我缺少
部分。感谢@BalusC为我指明了正确的方向。这已经在原始答案中提到的另一个Q/A中:区别在于不需要服务和数据库调用。请在ypur回答中详细解释。不要忘记,在这种情况下,可用项应该是一个列表。我们使用了HashMap并将其更改为List。
public Object getAsObject(FacesContext context, UIComponent component, String submittedValue) {
    if (submittedValue == null || submittedValue.isEmpty()) {
        return null;
    }

    try {
        return warehouseService.find(Long.valueOf(submittedValue));
    } catch (NumberFormatException e) {
        throw new ConverterException(new FacesMessage(submittedValue + " is not a valid Warehouse ID"), e);
    }
}
@FacesConverter(forClass=Warehouse.class)
<h:selectOneMenu ... converter="omnifaces.SelectItemsConverter">
@Override
public String toString() {
    return String.valueOf(id);
}
@Override
public String toString() {
    return "Warehouse[id=" + id + "]";
}
<h:selectOneMenu value="#{bean.selectedWarehouse}">
    <f:selectItem itemLabel="Choose one .." itemValue="#{null}" />
    <f:selectItems value="#{bean.availableWarehouses}" var="warehouse"
        itemLabel="#{warehouse.name}" itemValue="#{warehouse}" />
</h:selectOneMenu>
private Warehouse selectedWarehouse;
private List<Warehouse> availableWarehouses;
public abstract class ABaseEntity implements Serializable {

    private static final long serialVersionUID = 1L;

    public abstract Long getIdentifier();
}
@FacesConverter(value = "SelectItemToEntityConverter")
public class SelectItemToEntityConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext ctx, UIComponent comp, String value) {
        Object o = null;
        if (!(value == null || value.isEmpty())) {
            o = this.getSelectedItemAsEntity(comp, value);
        }
        return o;
    }

    @Override
    public String getAsString(FacesContext ctx, UIComponent comp, Object value) {
        String s = "";
        if (value != null) {
            s = ((ABaseEntity) value).getIdentifier().toString();
        }
        return s;
    }

    private ABaseEntity getSelectedItemAsEntity(UIComponent comp, String value) {
        ABaseEntity item = null;

        List<ABaseEntity> selectItems = null;
        for (UIComponent uic : comp.getChildren()) {
            if (uic instanceof UISelectItems) {
                Long itemId = Long.valueOf(value);
                selectItems = (List<ABaseEntity>) ((UISelectItems) uic).getValue();

                if (itemId != null && selectItems != null && !selectItems.isEmpty()) {
                    Predicate<ABaseEntity> predicate = i -> i.getIdentifier().equals(itemId);
                    item = selectItems.stream().filter(predicate).findFirst().orElse(null);
                }
            }
        }

        return item;
    }
}
<p:selectOneMenu id="somItems" value="#{exampleBean.selectedItem}" converter="SelectItemToEntityConverter">
    <f:selectItem itemLabel="< select item >" itemValue="#{null}"/>
    <f:selectItems value="#{exampleBean.availableItems}" var="item" itemLabel="${item.identifier}" itemValue="#{item}"/>
</p:selectOneMenu>