我尝试在Vaadin Spring Boot中使用BeanFieldGroup<Entity>
,带有javax.validator
和Hibernate验证器。
@NotBlank(message = "{may.not.null}")
@Column(name = "name", unique = true)
private String name;
我创建了两个文件:ValidationMessages_en.properties
:
may.not.null=not null
和ValidationMessages_fr.properties
:
may.not.null=non null
但即使我将语言更改为法语,验证器消息仍然来自ValidationMessages_en.properties
.
请问你们中有人对此有任何想法吗?
BeanFieldGroup
使用区域设置创建 BeanValidator,该区域设置为正在验证的组件。您的问题没有提到如何为name
属性创建文本字段,但让我们假设您以这种方式创建它:
TextField nameTextField = new TextField("Name");
这里的重要因素是在将属性与BeanFieldGroup
绑定之前确保nameTextField
具有正确的区域设置(您可以使用nameTextField.getLocale()
检查区域设置)。
因此,请尝试将文本字段配置为使用会话区域设置,如下所示:
nameTextField.setLocale(UI.getCurrent().getLocale());
这段代码从请求("接受语言"请求标头)中获取语言环境并将其设置为字段 ->然后BeanFieldGroup
将使用正确的语言环境创建 BeanValidators,并且验证消息被本地化(这发生在BeanFieldGroup#configureField
中)。
但是,仅使用此代码来检查问题是否真的只在于您的文本字段没有正确的区域设置。这真的并不意味着您必须为每个字段设置区域设置......这是因为在 Vaadin 中(至少在 Vaadin 7 中),会话(基于请求)区域设置应该由组件从父级继承。因此,如果您将 TextField 添加到布局中,则 TextField 继承布局的区域设置,布局从视图继承它,依此类推(一直到UI.getCurrent().getLocale()
- 因此请检查您是否在那里有所需的区域设置)。由于继承发生在addComponent()
调用期间,因此我的猜测是,也许在您的情况下,在实际使用BeanFieldGroup
绑定之前调用addComponent()
方法(将 TextField 添加到布局中)就足够了。
有关您的问题的更多信息,请参阅此处:请记住设置区域设置
注意:我现在尝试对您的问题进行编码,我遇到了与您相同的问题,并通过在 BeanFieldGroup 之前移动 addComponent() 调用来解决它。