JSF的转换器

时间:2013-01-11 22:00:56

标签: java jsf java-ee jsf-2 managed-bean

我收到以下错误:Conversion Error setting value 'home' for 'null Converter'. Home是显示内容的字符串表示。

对我来说,这没有意义。这是JSF代码:

<h:selectOneMenu value="#{createResourceDialogController.selectedDir}">
    <f:selectItems value="#{createResourceDialogController.dirs}" />
</h:selectOneMenu>

这是ManagedBean代码:

public Map<String,IDir> getDirs()
{
    Map<String,IDir> retVal = new LinkedHashMap<String, IDir>();
    List<IDir> dirs;
    if(isCompanyResource)
    {
        dirs = convertToIDir(getCompanyDir());
    }
    else
    {
        dirs = convertToIDir(getUserDir());
    }
    for(IDir iDir : dirs)
    {
        retVal.put(iDir.getDir(),iDir);
    }
    return retVal;
}

public IDir getSelectedDir()
{
    return selectedDir;
}

public void setSelectedDir(IDir selectedDir)
{
    this.selectedDir = selectedDir;
}

对我而言,似乎所有类型都匹配,甚至不需要转换器。 getDirs()会返回值为IDir的地图。当调用setter时,它应该是IDir?有什么想法吗?

1 个答案:

答案 0 :(得分:3)

JSF会在html <h:selectOneMenu />中转换您的select,其中只有纯文本中的value和label属性。因此,您需要使用转换器,或者您也可以使用id-label值创建SelectItem列表,当您收到表单时,只需使用id重新加载IDir

<强> XHTML

<h:selectOneMenu value="#{createResourceDialogController.selectedDirId}">
    <f:selectItems value="#{createResourceDialogController.options}" />
</h:selectOneMenu>

支持Bean

@ManagedBean
@ViewScoped
public class CreateResourceDialogController {

    private List<SelectItem> options;

    private String selectedDirId;

    private void initBean(){
        options = new ArrayList<SelectItem>();
        SelectItem item1 = new SelectItem(dir.getId.toString(), dir.getName());
        options.add(item1);
    }

    public List<SelectItem> getOptions(){
        return options;
    }

    public void setSelectedDirId(String dirId){
        selectedDirId = dirId;
    }

    public String getSelectedDirId(){
        return selectedDirId;
    }
}

看看这个tutorial。但是,如果您要多次重复使用此代码,则应考虑通过转换器,作为更清洁的解决方案。