当把Tomcat开发环境中的@Blank等注解放到weblogic环境下测试或上线时,有可能会报:
javax.validation.ValidationException:
Call to TraversableResolver.isReachable() threw an exception
cause by ClassCastException:
eclipse.persistence.PersistenceProviderImpl cannot be cast to javax.persistence.spi.PersistenceProvider
原因是:
在tomcat环境中hibernate Validator会默认在classpath中找PersistenceProvider的实现(eclipse.persistence.PersistenceProviderImpl)
而在weblogic中亦然,但实现找的确是(javax.persistence.spi.PersistenceProvider)
所以会发生类转换异常
两种解决方案:
1.在开发中即指定PersistenceProvider的实现为javax包下的实现(
DefaultTraversablerResolver,它试图确定你是否在类路径上有JPA。)
2.就是自定义TraversableResolver
code:
public class JPAIgnoreTraversableResolver implements TraversableResolver {
@Override
public boolean isReachable(Object traversableObject,
Node traversableProperty, Class<?> rootBeanType,
Path pathToTraversableObject, ElementType elementType) {
return true;
}
@Override
public boolean isCascadable(Object traversableObject,
Node traversableProperty, Class<?> rootBeanType,
Path pathToTraversableObject, ElementType elementType) {
return true;
}
}
获取
ValidatorFactory
时用上
自定义TraversableResolver
ValidatorFactory factory = Validation.byDefaultProvider()
.configure().traversableResolver(new JPAIgnoreTraversableResolver())
.buildValidatorFactory();
validator = factory.getValidator();