хибернация валидатор - персонализирана фабрика валидира два пъти

Използването на персонализиран 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>

Java:

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
}

Bean-validation.xml

Добавяне на ограничение за сесия на Hibernate чрез xml картографиране.

<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? Не


person djmj    schedule 07.06.2013    source източник
comment
Някои въпроси за пояснение: Как задействате валидиране? Как се използва обектът configuration в следното? Имате ли конфигурация, свързана с валидиране, на други места, напр. persistence.xml? Между другото. не е нужно да указвате фабриката за валидатор на ограничение в XML, просто я предайте, когато поставяте ValidatorFactory в конфигурационния обект: ValidatorFactory vf = Validation.byDefaultProvider().configure().constraintValidatorFactory( new SessionConstraintValidatorFactory ( sessionFactory).getValidatorFactory() ;   -  person Gunnar    schedule 08.06.2013


Отговори (1)


Ограничението се валидира два пъти, защото вие указвате две групи за валидиране при предварително запазване във вашия файл „Hibernate-Configuration“, Default и Create.

Ограничението е част от групата Create според вашето XML съпоставяне, докато груповата последователност по подразбиране от тип Bean също съдържа тази група (съгласно анотацията @GroupSequence на Bean). Следователно ограничението се валидира два пъти, веднъж като част от групата по подразбиране и веднъж като част от групата Create.

Така че или валидирате само една група при предварително запазване, или променяте груповата последователност по подразбиране от типа Bean.

person Gunnar    schedule 08.06.2013