【问题标题】:How to show validator error messages to user when validation error occures?发生验证错误时如何向用户显示验证错误消息?
【发布时间】:2015-12-20 09:19:26
【问题描述】:

我有以下场景:

  1. 我有一个带有 DoubleRangeValidator 的字段,其中指定了错误消息 field.addValidator(new DoubleRangeValidator("工资必须是数值。",0d,1000000d));

  2. 在“保存”按钮下,我调用 BeanFieldGroup.commit(),它会在此类字段中引发非数值异常

  3. 为了显示错误,我使用了此处提到的 ErrorUtils 类 Display error messages directly in Vaadin 7

.. 它只是为所有字段/组件调用 component.getErrorMessage() 并收集所有错误消息。但是带有 DoubleRange 验证器的字段为 getErrorMessage() 返回 null,因此此处没有可用的错误消息。这同样适用于其他验证器。所以我的问题是在 commit() 期间发生验证错误时如何显示验证器错误消息?

【问题讨论】:

    标签: vaadin vaadin7


    【解决方案1】:

    我已尝试使用您提到的 ErrorUtils 类重现您的错误,但 getErrorMessage 方法未返回 null。您创建BeanFieldGroup 和/或Field 的方式可能有问题。这是我的代码:

    @Override
    protected void init(VaadinRequest request) {
    
        BeanFieldGroup<MyBean> bfg = new BeanFieldGroup<>(MyBean.class);
        bfg.setItemDataSource(new MyBean());
    
        Field<?> salaryField = bfg.buildAndBind("salary");
        salaryField.addValidator(new DoubleRangeValidator("Salary must be a numeric value.", 0d, 1000000d));
    
        Button commit = new Button("Save", e -> {
            try {
                bfg.commit();
            }
            catch (CommitException ce) {
                ErrorUtils.showComponentErrors(bfg.getFields());
            }
        });
    
        VerticalLayout hLayout = new VerticalLayout(salaryField, commit);
        setContent(hLayout);
    }
    
    public class MyBean implements Serializable {
    
        private static final long serialVersionUID = 1L;
    
        private double salary;
    
        public MyBean() {}
    
        public double getSalary() {
            return salary;
        }
    
        public void setSalary(double salary) {
            this.salary = salary;
        }
    }
    

    【讨论】:

    • 谢谢,我发现我有 field.setValidationVisible(false); ...它导致验证消息不可用。将其设置为 true 会使错误消息可用。但现在它显示默认消息“无法将值转换为 Double”而不是我的自定义文本。
    • 是的,在验证(即通过DoubleRangeValidator)工资值之前,Vaadin 必须首先将其转换为属性的类型(即double),这就是新错误的来源。如果您想覆盖它,请使用field.setConverter()。这里有一个例子:vaadin.com/forum#!/thread/3625631.
    猜你喜欢
    • 1970-01-01
    • 2019-06-11
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    • 2022-06-20
    • 1970-01-01
    相关资源
    最近更新 更多