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 不过 ;-)
我在搭载 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 不过 ;-)