3

JSR-303検証を使用して、春に注釈付きBeanの単体テストを追加しようとしています。

Beanは次のような単純なものです。

public class Bean {
   @Size(max=XX)  
   String text;  
}  

Spring構成には、必要なすべてのJARファイルがあります。

 validation-api  
 hibernate-validator

バリデーターは次のように初期化されます。

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />

テストケースでの私の試みは次のようになります(春と他の綿毛が取り除かれました):

@Autowired
private LocalValidatorFactoryBean factory;


@Test
public void testTemplateFormBeanValidation() {
// TODO exception at the moment. Can not resolve the validator. Provider issue.
factory.setProviderClass(HibernateValidator.class);
factory.setTraversableResolver(new DefaultTraversableResolver());
Validator val = factory.getValidator();
TemplateFormBean fb1 = new TemplateFormBean();
fb1.setText("this text works");
Set<ConstraintViolation<TemplateFormBean>> constraints = val.validate(fb1);
assertNull(constraints);

}

このテストを実行すると、次のスタックトレースが得られます。

java.lang.AbstractMethodError: javax/persistence/spi/PersistenceProvider.getProviderUtil()Ljavax/persistence/spi/ProviderUtil;
at javax.persistence.Persistence$1.isLoaded(Persistence.java:78)
at org.hibernate.validator.engine.resolver.JPATraversableResolver.isReachable(JPATraversableResolver.java:62)
at org.hibernate.validator.engine.resolver.DefaultTraversableResolver.isReachable(DefaultTraversableResolver.java:94)
at org.hibernate.validator.engine.resolver.SingleThreadCachedTraversableResolver.isReachable(SingleThreadCachedTraversableResolver.java:47)
at org.hibernate.validator.engine.ValidatorImpl.isValidationRequired(ValidatorImpl.java:757)
at org.hibernate.validator.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:324)
at org.hibernate.validator.engine.ValidatorImpl.validateConstraintsForRedefinedDefaultGroup(ValidatorImpl.java:273)
at org.hibernate.validator.engine.ValidatorImpl.validateConstraintsForCurrentGroup(ValidatorImpl.java:256)
at org.hibernate.validator.engine.ValidatorImpl.validateInContext(ValidatorImpl.java:210)
at org.hibernate.validator.engine.ValidatorImpl.validate(ValidatorImpl.java:119)
at org.springframework.validation.beanvalidation.SpringValidatorAdapter.validate(SpringValidatorAdapter.java:145)
at general.TestValidationBeans.testTemplateFormBeanValidation(TestValidationBeans.java:30)

いくつかの依存関係がありませんか?永続性としてJPA2アノテーションを使用してHibernateを使用しているため、これらのJARはすべて存在し、機能しています。

Hibernateのバージョンは次のとおりです。

2011-04-19 08:37:47 [INFO] Version - Hibernate Commons Annotations 3.2.0.Final
2011-04-19 08:37:47 [INFO] Environment - Hibernate 3.6.2.Final
2011-04-19 08:37:47 [INFO] Environment - hibernate.properties not found
2011-04-19 08:37:47 [INFO] Environment - Bytecode provider name : javassist
...
2011-04-19 08:37:47 [INFO] Version - Hibernate Validator 4.1.0.Final

Hibernateがhibernate-annotationsのバージョンをログに記録しないのはなぜですか?ドキュメントによると、私が使用しているhibernate3.jarのhibernate3.5からバンドルされています。
Hibernateアノテーション(「バージョン-Hibernateアノテーション3.4.0 GA」など)のログ出力を表示する必要がありますか?

4

2 に答える 2

11

次のように、コンテキスト構成を使用したより簡単なセットアップがあります。

MyTest.java

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class MyTest {

    @Autowired
    private Validator validator;


    @Test
    public void testMyForm() {
        final MyForm form = new MyForm();
        .
        .
        final Set<ConstraintViolation<MyForm>> violations = validator.validate(form);
        assertTrue(violations.isEmpty());
    }
}

MyTest-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="validator"
        class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />

</beans>
于 2011-08-25T11:39:22.337 に答える
0

これは、バージョンに問題があることを示していると思います。使用しているJPAJARのバージョンには、Springが期待するものとは異なるメソッドシグネチャがあります。SpringのJARを使用するようにJARを更新してみて、それが役立つかどうかを確認してください。

于 2011-04-18T14:56:34.773 に答える