JSF 2.0 "转换错误在 Primefaces 选项列表中为"空转换器"设置值 'courseID'



当我想保存我的选择列表的数据时,我得到了以下错误

'组[id=null,groupName=TEST,distinguishedName="distinguisedNameForGroup"'für'null Converter'。

这是我用来做它的转换器@FacesConvert(value="groupConverter",forClass=Group.class)公共类GroupConverter实现Converter{

@Override
public Object getAsObject(FacesContext context, UIComponent component,
        String value) {
     if (value.trim().equals("")) {
            return null;
     }
    Object ret = null;
    if (component instanceof PickList) {
        Object dualList = ((PickList) component).getValue();
        DualListModel<?> dl = (DualListModel<?>) dualList;
        for (Object o : dl.getSource()) {
            String id = ((Group) o).getDistinguishedName();
            if (value.equalsIgnoreCase(id)) {
                ret = o;
                break;
            }
        }
        if (ret == null)
            for (Object o : dl.getTarget()) {
                String id = ((Group) o).getDistinguishedName();
                if (value.equals(id)) {
                    ret = o;
                    break;
                }
            }
    }
    return ret;
}
@Override
public String getAsString(FacesContext context, UIComponent component,
        Object value) {
    if (value == null || value.equals("")) {
        return "";
    } else {
        String str = "";
        if (value instanceof Group) {
            str = ""
                    + ((Group) value)
                            .getDistinguishedName();
        }
        return str;
    }
}

}

pickList的代码:

<p:pickList
    value="#{bean.groups}" var="group"
    itemLabel="#{group.groupName}" itemValue="#{group}"
    converter="groupConverter">
</p:pickList>

我不理解这个错误,因为在网上我发现转换器没有被调用,但肯定被调用了。我的想法已经用完了。不存在null值或任何内容。Group.class有一个equal和hashcode方法。

更新:我发现selectOneMenu会出错。这是它的代码。没有转换器,这可能是问题所在。测试它。

<p:selectOneMenu id="abteilungsleiterrolle"
    value="#{bean.object.group}">
    <f:selectItems value="#{bean.source}" var="q"
        itemValue="#{q}" itemLabel="#{q.groupName}"/>
</p:selectOneMenu>

试试这个

 @ViewScope   
@FacesConverter(value="pickListConverter")    
public class PickListConverter implements Converter{   
    Map<String, Object> tmp;
    @PostConstruct
    public void init() {
        tmp = new HashMap<String, Object>();
    }
    @Override   
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        return tmp.get(value);
    }
    @Override   
    public String getAsString(FacesContext context, UIComponent component, Object value) {  
        if (value == null || value.equals("")) {
            return "";
        } else {
            tmp.put(value.toString(), value);
            return value.toString();
        }
    }   
}

这个转换器只确保toString()NameClass和字段以及id),例如"Group[id="+id+"]"是良好的格式,但这个转换器适用于任何

记住更改转换器名称:

<p:pickList
value="#{bean.groups}" var="group"
itemLabel="#{group.groupName}" itemValue="#{group}"
converter="pickListConverter">

错误消息"für 'null Converter'."的一部分表示找不到有效的转换器。您可以尝试以下操作:

  • 如果#{bean.groups}解析为对象List<Group>,JSF应该像您指定的forClass=Group.class一样,按类找到匹配的转换器,但我认为您不必为转换器命名
  • 尝试删除for class属性以按名称引用它
  • 您可以用@ManagedBean对其进行注释,并为bean指定el,例如#{groupConverter}

如果调用了converter方法,但错误仍然存在,则其他jsf组件可能会产生找不到转换器("null converter")错误。请记住,如果您指定value="#{bean.group}",其中bean.group是group.class对象并省略converter,那么JSF将查找用forClass="group.class"注释的converter。

最新更新