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

使用Hibernate验证Vaadin Bean的验证-使用UTF-8验证器

万楷
2023-03-14

首先,我是Vaadin7的新手。当我发现BeanFieldGroup.class时,我正在尝试一些vaadin演示。正如我所看到的,这个类将一个字段绑定到一个bean属性。在bean中,使用验证约束注释对属性进行注释(JSR303)。在本例中,我的pom.xml包含hibernate验证器依赖项:

<dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>5.1.0.CR1</version>
</dependency>

我创建了validationmessage.properties文件,并在其中放了一些消息(带有匈牙利字符),它以UTF-8格式保存,例如:

validation.NotBlank=Árvíztűrő tükörfúrgép

下面是带注释的bean属性:

@NotNull(message = "{validation.NotBlank}")
private String name = null;
private MessageSource MessageSource(){
    ReloadableResourceBundleMessageSource reloadableResourceBundleMessageSource = new ReloadableResourceBundleMessageSource();
    reloadableResourceBundleMessageSource.setCacheSeconds(5000);
    reloadableResourceBundleMessageSource.setFallbackToSystemLocale(false);
    reloadableResourceBundleMessageSource.setDefaultEncoding("UTF-8");
    Properties properties = new Properties();
    properties.setProperty("fileEncodings", "UTF-8");
    reloadableResourceBundleMessageSource.setFileEncodings(properties);
    reloadableResourceBundleMessageSource.setBasename("classpath:/locales/messages");

    return reloadableResourceBundleMessageSource;
}

@Bean
public LocalValidatorFactoryBean validator(){

    LocalValidatorFactoryBean factory = new LocalValidatorFactoryBean();
    factory.setValidationMessageSource(MessageSource());

    return factory;
}

共有1个答案

刁浩言
2023-03-14

Vaadin的BeanFieldGroup使用另一个Vaadin类BeanValidator进行JSR-303验证。如果您在BeanValidator.getJavaxBeanValidator()GetJavaxBeanValidatorFactor()方法中查看它的源代码,您将看到它正在构建自己的ValidatorValidatorFactor实例。您需要对它进行子类,并用一个使用从Spring上下文获得的ValidatorFactor方法重写GetJavaxBeanValidatorFactor()方法,该上下文被正确设置为使用Spring自己的UTF-8编码的MessageSource,正如您在示例中所配置的那样。它还将帮助您进行调试,因为Spring的messageSource可以重新加载,这是一个巨大的保护程序。

编辑:在关于如何使用子类化重写的注释中,我意识到,以Vaadin API这部分的当前状态(从7.5.9版开始),我无法优雅地完成它。由于我们不能优雅地完成它,我们可以通过反射来完成它,将这个hack实现为spring组件

@Component
public class VaadinValidationHack implements InitializingBean {

    @Autowired
    private ValidatorFactory validatorFactory;

    protected void hack() throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
        Field field = BeanValidator.class.getDeclaredField("factory");
        if (!field.isAccessible()) {
            field.setAccessible(true);
        }
        field.set(null, validatorFactory);
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        hack();
    }

}
 类似资料:
  • 现在,我正在用Spring MVC开发一个web应用程序。 样品值可以是“0.05”、“1.00”、“12.55”等。 因此,如果有任何办法来解决这个问题,请点亮我。谢了。

  • 我需要应用一个双值验证,这需要与圆周率匹配。我正在考虑使用@pattern(regex=“3.14159265359”)。这是使用Hibernate验证约束应用这样一个约束的最佳方式吗?谢谢

  • 我正在用以下组件构建自己的证书链: 根证书是自签名证书,中间证书由根证书和用户由中间证书签名。 现在我想验证一个用户证书是否有其根证书的锚。 具有 验证是可以的。在下一步中,我将使用 验证结果显示 什么是错的?

  • 我正在尝试使用自定义Bean验证来验证应该大于零的数值,但问题是使用如下单个自定义验证器来验证任何数值:整数、浮点数、双......: 整数int; @PositiveNumber双倍双; 这可能吗?

  • 我现在把这两者搞混了。我知道Hibernate Validator6是Bean验证2.0规范的参考实现。它支持分组、错误消息国际化、自定义方法验证等。问题是Spring5支持这些特性还是我只剩下Hibernate Validator6了? 网上所有的参考例子都建议使用Hibernate验证器,没有什么关于Spring验证的发现,请建议或指向其他链接。

  • 我正在使用Spring Boot 2.2.0用java bean验证框架构建一个restful服务。Hibernate-Validator在幕后使用。验证工作得很好,但在一个字段与约束不匹配后会引发异常。我想先验证所有字段,然后给消费者一个包含所有错误的响应。这可能吗?