java - 丰富 :select shows "Value is not valid option" after selecting and converting the item to an object

标签 java validation jsf richfaces converters

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

test.xml

<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-converter,用于将选择的字符串值转换为 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 文件的 backing-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 实例(事实上,这个“测试”项目是一个孤立的案例)对于我第一次发现这个问题的工作项目,并且在该项目中,转换器成功地使用注入(inject)的服务从数据库检索对象)。

显然,bean save 方法永远不会被调用,因为 View 因此错误而陷入 jsf 验证阶段。

尝试用 h:selectOneMenu 替换 rich:select 但效果是一样的。我已经浏览了很多 jsf-converter 教程/文档/引用资料,但我仍然不知道我做错了什么。

我正在使用 Maven 和 Richfaces BOM 配置,如所指出的 here ,将版本替换为 4.2.2.Final (希望更新可以修复它)

我发布了test project here

任何帮助将非常感激,我花了很多时间试图找到解决方案,也许是简单/愚蠢的事情,但我只是厌倦了调试/搜索

最佳答案

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

关于java - 丰富 :select shows "Value is not valid option" after selecting and converting the item to an object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12966087/

相关文章:

python - 如何在 FastAPI 中禁用模式检查?

asp.net - REGEX - 匹配字符串中任意位置的特殊字符

jsf - 托管 bean 中的 View 和 Request 范围之间的区别

java - 使用 Java 和 BouncycaSTLe 进行 X.509 证书验证

java - 如何在 Docker 容器内设置执行器 IP?

java - JVM 如何管理 Java 接口(interface)?

java - 当类路径包含许多目录时,类路径根是什么意思?

jsf - 动态 UI 包含在 Primefaces 对话框中

html - 我的 <ui :define name ="content"> tag doesn't appear in the JSF view 的内容

java - 如何根据查询输出传递的值在 Excel 中创建多个工作表