我在运行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
答案 0 :(得分:2)
没有办法做你想做的事。 Hibernate Validator确实具有编程映射,但它是Hibernate Validator的特定功能。无法以Bean验证方式引导此功能。我这样说,因为在容器中自定义ValidatorFactory和Validator实例的唯一方法是通过validation.xml。并且此配置文件中没有用于流畅API的机制。
你的JNDI想法本质上是好的,但正如你所说,它只是只读。
validation.xml允许提供特定于供应商的属性。人们可以想象像org.hibernate.validator.config_factory=acme.MyConfig
这样的财产。该属性的值将指向一个完全指定的类,该类将包含某种工厂方法,该方法返回要添加到配置中的编程映射。不幸的是,这样的财产尚不存在。您可以打开问题here; - )