环境:weblogic10.3.4 + PATCH QWG8(支持JPA2)
Spring和Hibernate相关jar包都是使用CAS3.4.2的webapp的lib里面的启动过程没有发生任何错误,但是登录过程出现异常:
java.lang.AbstractMethodError: org.apache.openjpa.persistence.PersistenceProviderImpl.getProviderUtil()Ljavax/persistence/spi/ProviderUtil;
at javax.persistence.Persistence$PersistenceUtilImpl.isLoaded(Unknown Source)
at org.hibernate.validator.engine.resolver.JPATraversableResolver.isReachable(JPATraversableResolver.java:33)
at org.hibernate.validator.engine.resolver.DefaultTraversableResolver.isReachable(DefaultTraversableResolver.java:112)
at org.hibernate.validator.engine.resolver.SingleThreadCachedTraversableResolver.isReachable(SingleThreadCachedTraversableResolver.java:47)
at org.hibernate.validator.engine.ValidatorImpl.isValidationRequired(ValidatorImpl.java:764)
at org.hibernate.validator.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:331)
at org.hibernate.validator.engine.ValidatorImpl.validateConstraintsForRedefinedDefaultGroup(ValidatorImpl.java:278)
at org.hibernate.validator.engine.ValidatorImpl.validateConstraintsForCurrentGroup(ValidatorImpl.java:260)
at org.hibernate.validator.engine.ValidatorImpl.validateInContext(ValidatorImpl.java:213)
at org.hibernate.validator.engine.ValidatorImpl.validate(ValidatorImpl.java:119)
at org.springframework.validation.beanvalidation.SpringValidatorAdapter.validate(SpringValidatorAdapter.java:86)
at org.springframework.webflow.validation.ValidationHelper.invokeValidatorDefaultValidateMethod(ValidationHelper.java:233)经过分析和相关资料查询,是在HV调用persistentunit的信息的时候出错了,原因应该是weblogic中JPA2使用的openJPA没有实现PersistenceProvider中的getPersistentUnit()接口导致,这个应该是wenblogic的一个bug才对,这个bug也有在hibernate的问题社区论坛中有出现过,不过hibernate把他看做是weblogic的问题skip了不知道大家有没有其他途径解决这个问题????????????

解决方案 »

  1.   

    按以下方式实现:
    1.在webligic-application.xml中加入本地应用包预先加载规则:
    <prefer-application-packages>
        <package-name>javax.persistence.*</package-name>
        <package-name>antlr.*</package-name>
    </prefer-application-packages>2.自己实现一个PersistenceProviderResolver,代码如下:
    public class MyCachingPersistenceProviderResolver implements PersistenceProviderResolver {

    private List<PersistenceProvider> providers = new ArrayList();

    @Override
    public List<PersistenceProvider> getPersistenceProviders() {
    providers.add(new HibernatePersistence());
    return providers;
    } @Override
    public void clearCachedProviders() {
    // TODO Auto-generated method stub
    }
    }3.在应用自启动的servlet里面设置hibernate默认的PersistenceProviderResolver:System.out.println("动态设置PersistenceProviderResolver!");
    PersistenceProviderResolverHolder.setPersistenceProviderResolver(new MyCachingPersistenceProviderResolver());否则hibernate会默认使用他自己的PersistenceProviderResolverPerClassLoader,意思就是会寻找所有classloader下面的
    META-INF/services/中的PersistenceProvider实现,具体可以参考一下Hibernate的PersistenceProviderResolverHolder源码