当前位置: 首页 > 知识库问答 >
问题:

带有BeanItemContainer和BeanFieldGroup的组合框引发转换异常

解河
2023-03-14

我做了一些测试,看看如何将combobox绑定到一些bean属性,但我得到了一个异常:“ConversionException:无法将值转换为字符串在..........”我的示例在使用组合框的indexedContainer时工作正常,但是在使用BeanItem容器时遇到了一些问题。我所拥有的:1。TestCountry,BeanItemContainer的简单java bean(为了简单起见,我在这里不放setter和getter或constructor):

public class TestCountry implements Serializable {
    private String name;
    private String shortName;
}

>

  • BeanItemContainer 的实例化

    BeanItemContainer<TestCountry> _data = new BeanItemContainer<TestCountry>(TestCountry.class);
    _data.addItem(new TestCountry("Afganistan","AF"));
    _data.addItem(new TestCountry("Albania","AL"));
    

    豆田集团。这里TestBean是另一个具有简单字符串属性的Bean(“名字”、“电话”、“国家”)

    BeanFieldGroup<TestBean> binder =  new BeanFieldGroup<TestBean>(TestBean.class);
    

    下拉列表框

    ComboBox myCombo = new ComboBox("Select your country", _data);
    

    基本代码

    binder.bind(myCombo, "country");
    

    当我尝试提交绑定器时,我得到了一个关于将问题转换为字符串的错误。根据我对阅读书籍和vaadin api的理解,BeanItem容器使用豆本身作为标识符,并且(这里可能是错误的)绑定器使用项目标识符来绑定属性。所以这就是问题所在,从Bean到字符串的转换。我尝试在我的测试国豆上实现toString(),哈希()和等于(),但没有成功。在这种情况下,如何才能使用 BeanItem 容器?

    提前谢谢!!

  • 共有1个答案

    艾阳羽
    2023-03-14

    您让Vaadin应用程序尝试将Bean(TestCountry)保存为TestBean中的String。

    这很好,但是你必须有一点不同。你有两个选择。你要么改变你的数据模型,所以TestBean看起来像这样:

    TestBean
    firstName - String
    phone - String
    country - TestCountry (1:n)
    

    现在TestBean将存储一个TestCountry而不是一个字符串,并且您的ComboBox不应该再抛出任何错误

    或者

    您不用Bean填充ComboBox,而是用国家字符串填充,因此Vaadin应用程序知道所选择的数据类型以及要在TestBean中保存的内容。

    myCombo.addItem(getStringOfCountryYouWantToAdd())
    ...
    

    然后,如果您将字符串属性“Country”绑定到现在只包含字符串的ComboBox,则活页夹现在将如何以及如何保存到“Country”中。

     类似资料:
    • 我有一个关于窃听和jpa-camel组件的问题。我有一个通过窃听拆分的异步路由。在每个路由中,我使用一个jpa生产者来持久化一个实体。问题是,在异步路由到达终点之前,entityManager已关闭。原因是异步路由中使用了相同的entityManager。主路由到达终点并关闭entityManager。 例如,如以下路线: 我认为一个可能的解决方案是检查entitymanager是否为null或已

    • 我试图弄清楚为什么Lettuce会给我带来这么多问题,而我正在运行我的性能测试,将它与Jedis进行比较。 我使用spring-data-redis1.8.11.release,并为通过Redistemplate访问redis的接口创建了自定义代理bean。Redis运行在AWS中,我使用AWS提供的集群配置endpoint作为节点,它有3个主节点和3个从节点。在性能测试过程中没有发生任何特殊情况

    • 我想在 WPF 中创建一个顶部有一个项的组合框,当它被选中时,选定项应设置为 null(重置为默认状态)。我一直在寻找,但没有找到令人满意的解决方案。 如果可能的话,我希望它只使用XAML代码或附加的行为来实现,因为我不太喜欢更改视图的ViewModel中的内容,或者重写标准控件。 这是我到目前为止想出的(缩短代码): 我认为最好的方法是以某种方式添加一个事件触发器,当项目被选中时,该触发器将设置

    • 所以,问题是当我试图通过转换器!这是枚举转换器(使用@FacesConverter(value=“TipoCampoConverter”)注释扩展EnumConverter) 错误为:javax.el.elException:无法将类java.lang.String类型的tipoCampoConverter转换为接口javax.faces.convert.Converter **编辑:

    • 问题内容: 在Java中: 抛出。为什么?为什么在这里投降?我不知道原因。 问题答案: 让我重命名您的班级,以使事情更加清楚。 -> 。 -> 。 仅仅因为你是一个人并不意味着你是一个人。你可能是一个。这就是将A强制转换为A的原因。 另一方面,每个是吗?答案是“是”。这就是为什么您 可以 编写如下代码: 要么 另外值得注意的是,您 可以 执行以下操作: 这样做的原因是您的变量实际上是在引用实例。因

    • 我有一个问题胸腺。我有一个带有组合框和一些字段的表单。我想把默认值放在组合框中,而“选择”对我不起作用。 代码如下: 其中“tipoDocumento”是具有两个值的枚举: 有人能帮我吗?