在 vaadin 表单验证的错误消息中添加新行

问题描述

我有一个绑定到 java 实体模型的表单字段。该模型有一个注释:

@ValidPassword
private String password

它用一些条件验证字段并返回包含每个失败条件的错误消息,以“\n”换行符分隔。

Vaadin 形式通过以下方式连接到此模型:

    username =  new TextField("Username");
    username.addClassName("username-field");
    password =  new PasswordField("Password");
    password.addClassName("password-field");
    binder.forField(username ).asrequired().bind("username");
    binder.forField(password).asrequired().bind("password");

将输入写入密码字段会导致: image-link 当我希望每个失败的条件都在新行上开始时。

解决方法

如果您想在 Vaadin 8 或类似 Vaadin 14 及更新版本中使用 JSR-303 Bean validation,那么您需要使用 BeanValidationBinder 而不是常规的 Binder。同样在这种情况下,您不应该使用

构建绑定
binder.forField(password).asRequired().bind("password");

而只是使用

binder.bindInstanceFields(form);

此外,如果您需要自定义错误的显示方式,您可以使用例如 ValidationStatusHandler,每次验证状态从有效变为无效时都会调用它,反之亦然。默认情况下,错误显示在组件中。您可以定义自己的组件,例如Html,您可以在其中使用丰富的格式。

    binder.forField(field).withValidationStatusHandler(handler -> {
        if (handler.isError()) {
            handler.getMessage().ifPresent(error -> {
                Html html = new Html("<span>"+error+"</span>");
                layout.add(html);
            });
        }
    }).bind("property");

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...