2011-04-18 125 views
3

我想在JSR-303验证的春天为注释bean添加一个单元测试。春季单元测试JSR-303验证

的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) 

我缺少一些依赖?我使用Hibernate和JPA2注释作为持久性,因此所有这些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 

为什么isn't Hibernate日志的Hibernate注解的版本?根据文档,它是从我正在使用的hibernate3.jar中的hibernate 3.5中捆绑的。
我应该看到日志Hibernate注解输出(类似“版本 - Hibernate注解3.4.0 GA)?

+0

我可以补充一点,它的工作原理使用此代码在控制器:@Valid TemplateFormBean FB,BindingResult结果。所以我相信我错过了一些配置时使用这种编程方式。 – Daniel 2011-04-19 12:53:29

+0

运行WebSphere Application Server 7时出现同样的错误,该错误包含JPA 1.0并且正在搞乱休眠JPA 2.0的实现。所以我的猜测是,在你的类路径的某个地方,你有JPA 1.0类 – Tommy 2012-07-04 15:43:28

回答

9

我有一个简单的建立使用上下文配置如下:

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> 
+0

我试过你的建议,我仍然得到原始错误:'java.lang.AbstractMethodError:javax/persistence/spi/PersistenceProvider.getProviderUtil()Ljavax/persistence/spi/ProviderUtil; at javax.persistence.Persistence $ 1.isLoaded(Persistence.java:78)'。非常奇怪,因为它在部署时完美工作,它确实看起来像版本不一致或缺少服务器瓶,就像@duffymo所说的,但我找不到错误。 – Daniel 2011-08-31 06:14:40

+0

我最近更新了所有Hibernate验证JAR到4.2.0 final和Hibernate JPA 2 API到1.0.1 final。仍然没有成功。 – Daniel 2011-08-31 06:44:52

+0

我回到了另一个项目的这个特定问题,这次它通过在测试用例中注入一个Validator而不是ValidatorFactory来完美地工作。我基本上让Spring理清加载提供者。所以这个答案对我来说是正确的。我正在使用Hibernate Validator 5.0.1和Spring 3.1.x. – Daniel 2013-08-22 13:56:03

0

我觉得这个说你已经有了一个版本问题JPA JAR的版本,你必须有。 。从春季预计的一个不同的方法签名尝试更新的JAR从春季使用的那些,并看看是否有帮助

+0

嗨,我调查了你的建议,但看不到版本不一致。我用我正在使用的版本更新了这个问题。 – Daniel 2011-04-19 07:03:12