富人:选择显示“值无效选项”选择和项目转换为对象之后(rich:select shows “Valu

2019-10-30 09:06发布

我列出类型元素的集合Test中(从我的域) 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转换器,用于选择字符串值转换为类型的OBJETS Test ,反之亦然:

TestConverter.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;
    }
}

当我选择一个有效的项目后,按“保存”按钮,我得到验证错误:“值是不是有效选项”,如下图所示:

我已经调试的转换getAsObject呼叫,它工作得很好,它返回一个有效的Test按预期(实际上,这个“测试”项目是一个工作项目中,我第一次发现这个问题的一个孤立的个案实例,并在该项目中的转换器成功利用注入的服务来检索数据库中的对象)。

显然,豆save方法不会被调用作为视图陷入这种错误的JSF验证FASE。

试图更换rich:selecth:selectOneMenu反而是一样的。 我已经冲浪了很多JSF转换器教程/文档/裁判,但我仍然不知道可能我做错了。

我使用maven和指出RichFaces的BOM配置在这里 ,取而代之的是版本4.2.2.Final虽然(希望更新可以修复它)

我张贴的测试项目在这里

任何帮助将非常感激,我花了这么多时间试图找到一个解决方案,也许是一些简单的/愚蠢的,但我只是累了调试运行中/搜索

Answer 1:

您需要实现equals()hashCode()的内部Test类,以便JSF可以在项目列表中找到自己的选择和转换的项目。 转换后,JSF会比较反对在列表中的项目所选择的项目,提高此错误,如果没有找到它。



文章来源: rich:select shows “Value is not valid option” after selecting and converting the item to an object