Vaadin& Spring Boot - ValidationMessages.properties中的替代翻译未被选中

时间:2016-12-26 13:49:51

标签: validation spring-boot vaadin bean-validation

我尝试在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

请你们有什么想法吗?

1 个答案:

答案 0 :(得分:0)

BeanFieldGroup使用语言环境创建BeanValidator,该语言环境设置为验证下的组件。您的问题没有提到如何为name属性创建文本字段,但我们假设您以这种方式创建它:

TextField nameTextField = new TextField("Name");

这里的重要因素是确保nameTextField具有正确的区域设置,然后将属性与BeanFieldGroup绑定(您可以使用{{1}检查区域设置})。

因此,尝试将TextField配置为使用会话语言环境,如下所示:

nameTextField.getLocale()

这段代码从请求中获取区域设置(“Accept-Language”请求标头)并将其设置为字段 - &gt;然后nameTextField.setLocale(UI.getCurrent().getLocale()); 将创建具有正确语言环境的BeanValidators,并且验证消息已本地化(这发生在BeanFieldGroup)。

但是,仅使用此代码检查问题是否真的只是因为您的文本字段没有正确的区域设置。这并不意味着您必须为每个区域设置区域设置那里的字段...那是因为在Vaadin(至少在Vaadin 7中)会话(基于请求)Locale应该由父组件继承。因此,如果您将TextField添加到Layout,那么TextField将继承Layout的语言环境,Layout将从View继承它,依此类推(一直到BeanFieldGroup#configureField - 所以请检查您是否有所需的语言环境) 。由于继承发生在UI.getCurrent().getLocale()调用期间,我猜是,可能,在您的情况下,调用addComponent()方法(您要添加的方法)就足够了TextField到布局)之前实际使用addComponent()绑定。

有关您的问题的更多信息,请访问:Remember to set the Locale

注意:我现在尝试编写您的问题,我遇到了与您相同的问题,并通过在BeanFieldGroup之前移动addComponent()来解决它。