有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java rich:select在选择项并将其转换为对象后显示“值无效选项”

我使用以下代码在rich:select中列出类型为Test(来自我的域)的元素集合:

测试。xtml

<rich:select value="#{testBean.test}" id="cmbTest"
    converter="#{testConverter}" enableManualInput="false">
    <f:selectItems value="#{testBean.all}" var="test" itemLabel="#{test.name}" />
</rich:select>
<rich:message for="cmbTest" />
<h:commandButton id="btnSave" action="#{testBean.save}" value="Save" />

我还有一个自定义jsf转换器,可以将select字符串值转换为Test类型的对象,反之亦然:

测试转换器。java

@Component
@Scope("request")
public class TestConverter implements Converter {
    @Override
    public Object getAsObject(FacesContext facescontext, UIComponent uicomponent, String value) {
        if (value == null) return null;
        return new Test(Integer.parseInt(value), "test" + value);
    }

    @Override
    public String getAsString(FacesContext facescontext, UIComponent uicomponent, Object obj) {
        if (obj == null) return null;
        return ((Test) obj).getId().toString();
    }
}

(正如您可能注意到的,我使用的是Spring)xhtml文件的支持bean定义如下:

TestBean。java

@Controller("testBean")
@Scope("session")
public class TestBean {
    private Test test;
    private List<Test> all; 

    public TestBean() {
        all = new ArrayList<Test>();
        for (int i = 0; i < 15; i++) { 
            all.add(new Test(1, String.format("test%d", i)));    
        }
    }

    public Test getTest() {
        return test;
    }

    public void save() {
        System.out.println("Save");
    }

    public List<Test> getAll() {
        return all;
    }
}

选择有效项后按“保存”按钮时,会出现验证错误:“值不是有效选项”,如下所示:

enter image description here

我已经调试了Converter getAsObject调用,它工作正常,它按预期返回一个有效的Test实例(实际上,这个“测试”项目是我第一次发现这个问题的工作项目的一个孤立案例,在那个项目中,Converter成功地使用注入的服务从数据库检索对象)

显然,bean save方法永远不会被调用,因为视图会因为这个错误而陷入jsf验证阶段

试图用h:selectOneMenu替换rich:select,但都是一样的。我已经浏览了很多jsf转换器教程/文档/参考文献,但我仍然不知道我可能做错了什么

我使用的是maven和Richfaces BOM配置,即here,将版本替换为4.2.2。最后一个问题(希望更新能解决)

我发布了test project here

任何帮助都将不胜感激,我花了这么多时间试图找到解决方案,可能是一些简单/愚蠢的事情,但我只是厌倦了调试/搜索


共 (1) 个答案

  1. # 1 楼答案

    您需要在Test类中实现equals()hashCode(),这样JSF就可以在项目列表中找到您选择并转换的项目。转换后,JSF会将所选项目与列表中的项目进行比较,如果没有找到,则会引发此错误