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

自定义转换器抛出java.lang.ClassCastException当调用setBean上绑定字段类型的文本字段

邵毅
2023-03-14

当我调用binder.setBean(vo)时,试图实现一个从textfield到自定义数据类型的自定义转换器并将同一个字段与binder绑定,它抛出了给定的异常

java.lang.ClassCastException:类com.demo.vo。DemoVO不能强制转换为类java.lang.String(com.demo.vo.DemoVO位于加载程序“deployment.demo.ear”@7cc3d734的未命名模块中;java.lang.String位于加载程序的模块java.base“bootstrap”)的deploymentdemo.ear.demo.war//com.vaadin.flow.component.textfield.textfild.setValue(textfields.java:34)中deployment.demo.ear.demo.war//com.vaadin.flow.data.binder.binder$BindingImpl.convertAndSetFieldValue(binder.java:1275)位于deploymentdemo.ear.demo.war//.com.vaadin.flowData.binder$BindingImpl.initFieldValue(binder.java:1196),位于deplloyment.dema.ear.demo.war://com.vadin.flow.data.binders$bindingingImpl.访问$200(binder.java:1032)位于java.base/java.util.ArrayList.forEach(ArrayList.java:1541)中的deployment.demo.ear.demo.war//com.vaadin.flow.data.binder.binder.lambda$setBean$1(binder.java:1772)

演示视频课

public class DemoVO {
    private int id;
    private String code;
    private String details;
    // getters
    // setters
}

转换器类别

public class DemoVOToStringConverter implements Converter<String, DemoVO> {

    private DemoVO demoVO;

    @Override
    public Result<DemoVO> convertToModel(String value, ValueContext context) {

        if (null == value)) {
            return Result.ok(null);
        }

        demoVO.setCode(value);
        return Result.ok(demoVO);
    }

    @Override
    public String convertToPresentation(DemoVO value, ValueContext context) {

        if (null == value)) {
            return null;
        }

        demoVO = value;
        return value.getCode();
    }
}

HeaderVO类

public class HeaderVO {
        private DemoVO demo = new DemoVO();
        // getter
        // setter
}

演示视图类

public class DemoView extends VerticalLayout implements BeforeEnterListener {
            
            private Binder<HeaderVO> binder = null; 
    
            public DemoView() {
                   binder = new Binder<>(HeaderVO.class);
    
                   TextField demoField = new TextField();
                   demoField.setMaxLength(10);
                   demoField.setLabel("Demo");
                   binder.forField(demoField).withConverter(new DemoVOToStringConverter()).bind("demo");
                   add(demoField);
            }
    
        @Override
        public void beforeEnter(BeforeEnterEvent beforeEnterEvent) {
               HeaderVO headerVO = new HeaderVO();
               binder.setBean(headerVO);
        }
   }

共有1个答案

程振濂
2023-03-14

在测试您的MRE时,我没有得到类转换异常,但我得到了这个异常:“java.lang.NullPointer例外:不支持空值”。文本字段不支持值,空值是空字符串。请注意,在转换方法上:从不返回空值。

我将使用bind()方法和ValueProvider,以及Setter

binder.forField(demoField)
        .bind(
            header -> header.getDemo().getCode(),
            (header, code) -> header.getDemo().setCode(code)
        );

注意空值。

(我不确定演示视频中演示视频的实例...不确定转换器是否可以重复使用。但看起来它可以工作。

 类似资料:
  • 我为我的自定义帖子“服务”设置了一个ACF字段,其中有“特色服务”复选框和“特色url”字段的ACF字段。如果用户检查该字段,这意味着它是一个特色服务,他可以填写特色url字段,它在单个页面上工作正常,但我需要在主页上调用它,以在主页上显示我的特色服务。我在主页上的代码如下: 如何获取主页上的“特色url”字段?

  • 我正在使用Dozer框架在JavaBean之间进行转换。我想使用Dozer的JavaApi而不是XML创建我的映射,以便能够操作和配置我的自定义转换器。 如果我使用下面代码中的备选方案1运行转换器,并删除xml文件中的alt 2映射,则转换工作正常,并调用自定义转换器。如果我使用备选方案2运行转换器-使用java API进行映射,则映射程序永远不会调用我的转换器。bean被转换,但相同类型的嵌套字

  • 是否可以创建string类型的自定义字段并在显示字段描述时显示它们?我想用YouTrack实现一个bug数据库,如果字段“steps to reproduce”必须写在一个很小的列中,这是不可能做到的。 我正在使用YouTrack2018.1。

  • 我在修改我安装的WordPress流行帖子插件时遇到了一些问题。 它可以选择从自定义字段获取缩略图,我已将其输入为“image_facebook”。但是缩略图没有显示。 在检查代码时,我发现imgsrc有post id而不是返回图像URL。 我已经把问题缩小到我安装的另一个插件http://wordpress.org/plugins/advanced-custom-fields/ 当它处于活动状态

  • 介绍 model 参考文档已经介绍了如何使用 Django 的标准字段类;例如 CharField, DateField,等等。对于很多应用来说,这些类足够用了。 但是在某些情况下, 你所用的Django 不具备你需要的某些精巧功能,或是你想使用的字段与 Django 自带字段完全不同。 Django 内置的字段类型并不能覆盖所有可能遇到的数据库的列类型,仅仅是些普通的字段类型,例如VARCHAR

  • 在我的wicket应用程序中,我想对一些具有double(原始类型为“double”,而不是“double”类型)值的文本字段使用我自己的转换器。