hibernate validator - пользовательская фабрика проверяет дважды

Использование пользовательского 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). ;   -  person Gunnar    schedule 08.06.2013


Ответы (1)


Ограничение проверяется дважды, потому что вы указываете две группы для проверки при предварительном сохранении в файле «Hibernate-Configuration», Default и Create.

Ограничение является частью группы Create в соответствии с вашим отображением XML, в то время как последовательность групп по умолчанию типа Bean также содержит эту группу (согласно аннотации @GroupSequence к Bean). Таким образом, ограничение проверяется дважды: один раз как часть группы по умолчанию и один раз как часть группы Create.

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

person Gunnar    schedule 08.06.2013