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通用转换器示例: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
<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>