hibernate验证器 - 自定义工厂验证两次

时间:2013-06-07 23:32:04

标签: hibernate bean-validation hibernate-validator

使用知道hibernate会话的自定义ConstraintValidatorFactory,通过使用以下代码将其添加到配置中,导致对此工厂负责的任何操作(创建,更新)进行双重验证。

此示例中的验证程序ValidBeanDatabase使用不同的实例调用两次。 所有其他约束都经过验证一次(@ValidBean为例)。

工厂和验证器的实现类似于这篇文章中的实施:
https://community.jboss.org/wiki/AccessingTheHibernateSessionWithinAConstraintValidator

的validation.xml

<constraint-validator-factory>package.SessionConstraintValidatorFactory</constraint-validator-factory>
<constraint-mapping>package/Bean-validation.xml</constraint-mapping>

爪哇:

final Configuration configuration = new Configuration().configure();

// get ValidatorFactory from validation.xml
final ValidatorFactory validatorFactory = Validation.byDefaultProvider().configure()
            .buildValidatorFactory();

// ... add SessionFactory to custom ConstraintValidatorFactory
((SessionConstraintValidatorFactory)validatorFactory.getConstraintValidatorFactory()).setSessionFactory(sessionFactory);

// set ValidatorFactory
configuration.getProperties().put("javax.persistence.validation.factory", validatorFactory);

豆:

@GroupSequence(value =
{
    Bean.class, Create.class
})
@ValidBean // custom class-level constraint
public class Bean
{
    // properties and validator annotations
}

豆的validation.xml

通过xml映射添加Hibernate会话感知约束。

<bean class="Bean" ignore-annotations="false">
    <class>
        <constraint annotation="package.ValidBeanDatabase">
            <groups>
                <value>package.groups.Create</value>
            </groups>
        </constraint>
    </class>
</bean>

编辑:

休眠-配置

<property name="javax.persistence.validation.group.pre-persist">
    javax.validation.groups.Default, package.groups.Create
</property>

Glassfish 3.1.2 使用Hibernate Validator 4.2

@Gunner 您是否在其他地方有任何与验证相关的配置,例如persistence.xml?

1 个答案:

答案 0 :(得分:0)

约束经过两次验证,因为您在文件“Hibernate-Configuration”,DefaultCreate中预先保留时指定了两个用于验证的组。

根据您的XML映射,约束是Create组的一部分,而类型Bean的默认组序列也包含此组(根据@GroupSequence注释Bean注释1}})。因此,约束被验证两次,一次作为默认组的一部分,一次作为Create组的一部分。

因此,您可以在预先保留时仅验证一个组,也可以更改Bean类型的默认组序列。