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

Hibernate validator programmatic constraints declaration and JSF

我在搭载 Hibernate-validator 5.1 的 WildFly 8.1 应用服务器上有一个 JSF-2.2 网络应用

我想使用 fluent API 以编程方式设置一些约束,因为它们取决于具体情况,例如 @Size 约束的最小值和最大值可能会有所不同,或者字段可能是 @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 不使用这个新的约束映射。

即使我打破了编程设置的约束,我也可以毫无问题地提交表单

我不知道如何配置 JSF 使用的 Validator 或 ValidatorFactory 或如何向 JSF 提供其他 Validator 或 ValidatorFactory...

或者可能更多的是关于配置 WildFly 服务器,在配置文件或 JNDI 中做一些事情,我不知道...


编辑

我尝试在 JNDI 中绑定新的验证器和验证器工厂 但是我不能因为"Naming context is read-only"

        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);

谢谢哈迪

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

atm 无法满足您的需求。 Hibernate Validator 确实具有编程映射,但它是 Hibernate Validator 特定的功能。无法以 Bean 验证方式 bootstrap 此功能。我这么说是因为在容器中自定义 ValidatorFactory 和 Validator 实例的唯一方法是通过 validation.xml。而且这个配置文件里面没有fluentAPI的机制。

您的 JNDI 想法原则上是好的,但正如您所说,它只是只读的。

validation.xml 虽然允许供应商特定属性。人们可以想象 属性 就像 org.hibernate.validator.config_factory=acme.MyConfig。 属性 的值将指向一个完全指定的 class,它将包含某种工厂方法,returns 将编程映射添加到配置中。不幸的是,这样的 属性 还不存在。你可以打开一个问题 here 不过 ;-)