Русский English Тэги View Sergey Zolotaryov's profile on LinkedIn Вход
org.apache.openjpa.persistence.ArgumentException при миграции с EJB на Spring
Постоянная ссылка 26-10-2007 anydoby java

Недели две разбирался с одной бякой - мигрировали с EJB3.0 на Spring (сама миграция заняла один день) и вылез глюк. Не то в Weblogic, не то в OpenJPA.


Caused by: <4|true|0.9.7> org.apache.openjpa.persistence.ArgumentException: Errors encountered while resolving metadata.  See nested exceptions for details.
    at org.apache.openjpa.meta.MetaDataRepository.resolve(MetaDataRepository.java:503)
    at org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepository.java:285)
    at org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepository.java:340)
    at org.apache.openjpa.kernel.QueryImpl.classForName(QueryImpl.java:1551)
    at org.apache.openjpa.kernel.ExpressionStoreQuery$1.classForName(ExpressionStoreQuery.java:104)
    at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getClassMetaData(JPQLExpressionBuilder.java:160)
    at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.resolveClassMetaData(JPQLExpressionBuilder.java:131)
    at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getCandidateMetaData(JPQLExpressionBuilder.java:211)
    at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getCandidateMetaData(JPQLExpressionBuilder.java:181)
    at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getCandidateType(JPQLExpressionBuilder.java:174)
    at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.access$500(JPQLExpressionBuilder.java:61)
    at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder$ParsedJPQL.populate(JPQLExpressionBuilder.java:1668)
    at org.apache.openjpa.kernel.jpql.JPQLParser.populate(JPQLParser.java:52)
    at org.apache.openjpa.kernel.ExpressionStoreQuery.populateFromCompilation(ExpressionStoreQuery.java:145)
    at org.apache.openjpa.kernel.QueryImpl.newCompilation(QueryImpl.java:644)
    at org.apache.openjpa.kernel.QueryImpl.compilationFromCache(QueryImpl.java:625)
    at org.apache.openjpa.kernel.QueryImpl.compileForCompilation(QueryImpl.java:591)
    at org.apache.openjpa.kernel.QueryImpl.compileForExecutor(QueryImpl.java:653)
    at org.apache.openjpa.kernel.QueryImpl.compile(QueryImpl.java:560)
    at kodo.kernel.KodoQuery.compile(KodoQuery.java:75)
    at org.apache.openjpa.persistence.EntityManagerImpl.createNamedQuery(EntityManagerImpl.java:785)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:340)
    at $Proxy150.createNamedQuery(Unknown Source)
    at com.db.rtp.tpm.tpadmin.tpmon.core.dao.TabsFilterManagerBean.findAll(TabsFilterManagerBean.java:44)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:296)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:177)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:144)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:107)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:166)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
    at $Proxy121.findAll(Unknown Source)
    at com.db.rtp.tpm.tpadmin.tpmon.webui.web.FilterTabsBean.getTabs(FilterTabsBean.java:79)
    ... 74 more
Caused by: <4|true|0.9.7> org.apache.openjpa.persistence.ArgumentException: The type "class com.anydoby.beabugs.MyPOJO" has not been enhanced.
    at org.apache.openjpa.meta.ClassMetaData.resolveMeta(ClassMetaData.java:1592)
    at org.apache.openjpa.meta.ClassMetaData.resolve(ClassMetaData.java:1566)
    at org.apache.openjpa.meta.MetaDataRepository.processBuffer(MetaDataRepository.java:656)
    at org.apache.openjpa.meta.MetaDataRepository.resolveMeta(MetaDataRepository.java:556)
    at org.apache.openjpa.meta.MetaDataRepository.resolve(MetaDataRepository.java:481)
    ... 113 more

Начал разбираться, чем эта "овца" так паршива, и оказалось, что в данном классе, в отличие от остальных, при создании объекта инициализировались некоторые свойства. После того, как была убрана инициализация, вылезло вот это:


Error 500--Internal Server Error
<4|true|0.9.7> org.apache.openjpa.persistence.ArgumentException: Could not locate metadata for the class using alias "MyPOJO". Registered alias mappings: "{CredentialMap=[class com.bea.common.security.store.data.CredentialMap], DomainRealmScope=[class com.bea.common.security.store.data.DomainRealmScope], WLSCredMapCollectionInfo=[class com.bea.common.security.store.data.WLSCredMapCollectionInfo], ResourceMap=[class com.bea.common.security.store.data.ResourceMap], BEASAMLAssertingParty=[class com.bea.common.security.store.data.BEASAMLAssertingParty], BEASAMLRelyingParty=[class com.bea.common.security.store.data.BEASAMLRelyingParty], PKIResourceMap=[class com.bea.common.security.store.data.PKIResourceMap], IdPPartner=[class com.bea.common.security.store.data.IdPPartner], Credential=[class com.bea.common.security.store.data.Credential], XACMLRoleAssignmentPolicy=[class com.bea.common.security.store.data.XACMLRoleAssignmentPolicy], PKITypeScope=[class com.bea.common.security.store.data.PKITypeScope], XACMLTypeScope=[class com.bea.common.security.store.data.XACMLTypeScope], WLSPolicyCollectionInfo=[class com.bea.common.security.store.data.WLSPolicyCollectionInfo], WLSRoleCollectionInfo=[class com.bea.common.security.store.data.WLSRoleCollectionInfo], BEASAMLPartner=[class com.bea.common.security.store.data.BEASAMLPartner], MyPOJO=null, Top=[class com.bea.common.security.store.data.Top], WLSCertRegEntry=[class com.bea.common.security.store.data.WLSCertRegEntry], Endpoint=[class com.bea.common.security.store.data.Endpoint], UserPasswordCredential=[class com.bea.common.security.store.data.UserPasswordCredential], SPPartner=[class com.bea.common.security.store.data.SPPartner], PasswordCredentialMap=[class com.bea.common.security.store.data.PasswordCredentialMap], Partner=[class com.bea.common.security.store.data.Partner], XACMLEntry=[class com.bea.common.security.store.data.XACMLEntry], RegistryScope=[class com.bea.common.security.store.data.RegistryScope], PasswordCredential=[class com.bea.common.security.store.data.PasswordCredential], XACMLAuthorizationPolicy=[class com.bea.common.security.store.data.XACMLAuthorizationPolicy]}"
    at org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepository.java:345)
    at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getClassMetaData(JPQLExpressionBuilder.java:164)
    at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.resolveClassMetaData(JPQLExpressionBuilder.java:142)
    at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getCandidateMetaData(JPQLExpressionBuilder.java:211)
    at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getCandidateMetaData(JPQLExpressionBuilder.java:181)
    at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getCandidateType(JPQLExpressionBuilder.java:174)
    at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.access$500(JPQLExpressionBuilder.java:61)
    at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder$ParsedJPQL.populate(JPQLExpressionBuilder.java:1668)
    at org.apache.openjpa.kernel.jpql.JPQLParser.populate(JPQLParser.java:52)
    at org.apache.openjpa.kernel.ExpressionStoreQuery.populateFromCompilation(ExpressionStoreQuery.java:145)
    at org.apache.openjpa.kernel.QueryImpl.newCompilation(QueryImpl.java:644)
    at org.apache.openjpa.kernel.QueryImpl.compilationFromCache(QueryImpl.java:625)
    at org.apache.openjpa.kernel.QueryImpl.compileForCompilation(QueryImpl.java:591)
    at org.apache.openjpa.kernel.QueryImpl.compileForExecutor(QueryImpl.java:653)
    at org.apache.openjpa.kernel.QueryImpl.compile(QueryImpl.java:560)
    at org.apache.openjpa.persistence.EntityManagerImpl.createNamedQuery(EntityManagerImpl.java:785)
    at org.apache.openjpa.persistence.EntityManagerImpl.createNamedQuery(EntityManagerImpl.java:62)
    at weblogic.deployment.TransactionalEntityManagerProxyImpl$QueryImpl.createQuery(TransactionalEntityManagerProxyImpl.java:120)
    at weblogic.deployment.TransactionalEntityManagerProxyImpl$QueryImpl.getResultList(TransactionalEntityManagerProxyImpl.java:192)
    at com.anydoby.beabugs.TestServlet.doGet(TestServlet.java:37)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:226)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:124)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:283)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:175)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3370)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
    at weblogic.security.service.SecurityManager.runAs(Unknown Source)
    at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2117)
    at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2023)
    at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1359)
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:200)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:172)

Вот с этим я никак не смог справиться, пришлось для этого POJO написать DAO с использованием JDBC :(

По этому поводу был отослан баг в BEA. Вот пример, который иллюстрирует баг и который я отослал в службу поддержки:


public class TestServlet extends HttpServlet {

    @PersistenceContext
    private EntityManager manager;
   
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        resp.setContentType("text/html; charset=utf-8");
        Query query = manager.createNamedQuery("PojoList");
        List<MyPOJO> filters = query.getResultList();
        PrintWriter writer = resp.getWriter();       
       
        for (MyPOJO filterPOJO : filters) {
            writer.write("filter: " + filterPOJO.getId());
            writer.write("<br>");
        }
    }

    public MyPOJO getPojo() {
        return null;
    }
}

Если запустить приложение на Weblogic 10, получим приколы, описанные выше :) В аттачменте к этой статье можно посмотреть исходный код проекта. Будем ждать, что скажет BEA.

Добавить комментарий

Предыдущая статья За что я не люблю JSF Следующая статья Java идиотека