Hibernate验证器编程约束声明和JSF

时间:2015-01-15 18:47:16

标签: jsf jsf-2 wildfly hibernate-validator wildfly-8

我在运行Hibernate-validator 5.1的WildFly 8.1应用服务器上有一个JSF-2.2 Web应用程序

我想使用流畅的API设置一些纲要programmaticaly,因为它们取决于案例,例如@Size约束的min和max可能会有所不同,或者字段可能是@NotNull ...

所以我尝试编程配置约束,例如在此描述:http://docs.jboss.org/hibernate/validator/5.0/reference/en-US/html_single/#section-programmatic-api

我喜欢尝试(在EJB @Singleton @Startup中):

HibernateValidatorConfiguration configuration = Validation
    .byProvider( HibernateValidator.class )
    .configure();

ConstraintMapping constraintMapping = configuration.createConstraintMapping();

constraintMapping
.type( Car.class )
    .property( "manufacturer", FIELD )
        .constraint( new NotNullDef() )
    .property( "licensePlate", FIELD )
        .ignoreAnnotations()
        .constraint( new NotNullDef() )
        .constraint( new SizeDef().min( 2 ).max( 14 ) );

Validator validator = configuration.addMapping( constraintMapping )
    .buildValidatorFactory()
    .getValidator();

但是JSF不会使用这种新的约束映射。

即使我打破了限制程序集

,我也可以毫无问题地提交表格

我不知道如何配置验证器或ValidatorFactory JSF正在使用或如何向JSF提供其他Validator或ValidatorFactory ......

或者可能更多是关于配置WildFly服务器,在配置文件或JNDI中要做的事情,我没有线索......


修改

我尝试在JNDI中绑定新的Validator和验证器工厂 但我不能,因为“命名上下文是只读的”

        Hashtable jndiProperties = new Hashtable();
        jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
        Context context = new InitialContext(jndiProperties);
        context.bind("java:comp/Validator", factory.getValidator());
        context.bind("java:comp/ValidatorFactory", factory);

谢谢哈代

正如您所建议的那样,我发布了Hibenate Validator的改进 https://hibernate.atlassian.net/browse/HV-955

1 个答案:

答案 0 :(得分:2)

没有办法做你想做的事。 Hibernate Validator确实具有编程映射,但它是Hibernate Validator的特定功能。无法以Bean验证方式引导此功能。我这样说,因为在容器中自定义ValidatorFactory和Validator实例的唯一方法是通过validation.xml。并且此配置文件中没有用于流畅API的机制。

你的JNDI想法本质上是好的,但正如你所说,它只是只读。

validation.xml允许提供特定于供应商的属性。人们可以想象像org.hibernate.validator.config_factory=acme.MyConfig这样的财产。该属性的值将指向一个完全指定的类,该类将包含某种工厂方法,该方法返回要添加到配置中的编程映射。不幸的是,这样的财产尚不存在。您可以打开问题here; - )

相关问题