2013-01-11 68 views
0

我收到以下错误信息:Conversion Error setting value 'home' for 'null Converter'.Home是正在显示的内容的字符串表示形式。JSF转换器

对我来说,这没有任何意义。下面是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的地图。当接球员被叫时,应该是IDir?有任何想法吗?

回答

3

JSF会将您的<h:selectOneMenu />转换为html select,它只有纯文本的值和标签属性。所以你需要使用一个转换器,或者你也可以创建一个带有id标签值的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。但是,如果您要多次重复使用此代码,则应考虑使用转换器,作为更干净的解决方案。

+0

非常感谢!这对我来说很有意义。 – user489041