【问题标题】:Hibernate validator programmatic constraints declaration and JSFHibernate 验证器编程约束声明和 JSF
【发布时间】:2015-01-15 18:47:15
【问题描述】:

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

我想使用 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 中绑定新的验证器和验证器工厂 但我不能,因为“命名上下文是只读的”

        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

【问题讨论】:

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


    【解决方案1】:

    没有办法 atm 做你所追求的。 Hibernate Validator 确实有程序化映射,但它是 Hibernate Validator 特有的特性。无法以 Bean Validation 的方式引导此功能。我这么说是因为自定义 ValidatorFactory 以及容器内的 Validator 实例的唯一方法是通过 validation.xml。并且这个配置文件中并没有 fluent API 的机制。

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

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

    【讨论】:

      猜你喜欢
      • 2017-04-14
      • 2014-02-27
      • 1970-01-01
      • 1970-01-01
      • 2015-11-30
      • 1970-01-01
      • 1970-01-01
      • 2011-03-16
      相关资源
      最近更新 更多