簡體   English   中英

在WebSphere Liberty中注入JPA實體管理器時出錯

[英]Error Injecting the JPA Entity Manager in WebSphere Liberty

我繼承了一個遺留應用程序,該遺留應用程序最初是用WebSphere 6.1構建的,然后又被遷移到了運行JPA 2.0和openJPA的WebSphere 8.0。 由於戰略原因,我們正在遷移到WebSphere Liberty。 我們首先在WebSphere Classic 8.5.5.8和JPA上進行了測試,並且實體管理器那里沒有問題。 但是,在Liberty 8.5.5.8上,出現以下異常:

javax.ejb.EJBException:無法解析CHServiceEAR應用程序的CHServiceEJB.jar模塊中CHServiceBean組件的javax.persistence.EntityManager類型的java:comp / env / com.xxx.xxxx.service.CHServiceBean / em引用。 com.ibm.wsspi.injectionengine.InjectionBinding.getInjectionObject(InjectionBinding.java:1493)..... [err]原因:[err] javax.ejb.EJBException:java:comp / env / com.xxxx。無法解析CHServiceEAR應用程序的CHServiceEJB.jar模塊中CHServiceBean組件的類型為javax.persistence.EntityManager的xxxx.service.CHServiceBean / em引用。 com.ibm.wsspi.injectionengine.InjectionBinding.getInjectionObject(InjectionBinding.java:1493)上的[err] [內部類]上的[err]

我還有另一個EJB注入問題,可以通過配置綁定文件解決,但是我無法解決此問題。 我有兩個應用程序,每個應用程序都有自己的EAR文件,但是都在同一Liberty JVM中運行。 應用程序A運行前端/ UI邏輯,而應用程序B是后端EJB / JPA接口。 在項目方面,JPA應用程序設置為2.0(我想使用2.1,但基於另一個線程,JPA 2.0和EJB 3.1達到了目前的水平……在這里查看我的其他線程主題-> Eclipse Juno和JPA 2.1支持 )。

這是我的server.xml文件:

    <server description="new server">

    <!-- Enable features -->
    <featureManager>
        <feature>javaee-7.0</feature>
        <feature>localConnector-1.0</feature>
        <feature>distributedMap-1.0</feature>
        <feature>adminCenter-1.0</feature> 
        <feature>ssl-1.0</feature>
        <feature>usr:webCacheMonitor-1.0</feature>
        <feature>webCache-1.0</feature>
        <feature>ldapRegistry-3.0</feature>
    </featureManager>

    <!--  Admin Center Config Start -->
    <!-- To access this server from a remote client add a host attribute to the following element, e.g. host="*" -->
    <httpEndpoint host="*" httpPort="9080" httpsPort="9443" id="defaultHttpEndpoint"/>

    <keyStore id="defaultKeyStore" password="xxxxxx"/> 

    <basicRegistry id="basic"> 
          <user name="admin" password="xxxxx"/> 
          <user name="nonadmin" password="xxxxxx"/> 
    </basicRegistry> 

    <administrator-role> 
      <user>admin</user>
    </administrator-role>

    <remoteFileAccess> 
       <writeDir>${server.config.dir}</writeDir> 
    </remoteFileAccess>

    <!-- Automatically expand WAR files and EAR files -->
    <applicationManager autoExpand="true"/>
    <applicationMonitor updateTrigger="mbean"/>

    <enterpriseApplication id="CHNewCHRDMEAR" location="CHNewCHRDMEAR.ear" name="CHNewCHRDMEAR">
        <application-bnd>
            <security-role name="AllAuthenticated">
                <special-subject type="ALL_AUTHENTICATED_USERS"/>
            </security-role>
        </application-bnd>
    </enterpriseApplication>
    <enterpriseApplication id="CHServiceEAR" location="CHServiceEAR.ear" name="CHServiceEAR"/>

    <!--  JAAS Authentication Alias (Global) Config -->
    <authData id="dbUser" password="{xor}MzhmJT06ajI=" user="dbUser"/>

    <!--  JDBC Driver and Datasource Config -->
    <library id="DB2JCC4Lib">
        <fileset dir="C:\DB2\Jars" includes="db2jcc4.jar db2jcc_license_cisuz.jar"/>
    </library>

    <dataSource containerAuthDataRef="dbUser" id="CHTEST2" jndiName="jdbc/nextgen" type="javax.sql.XADataSource">
        <jdbcDriver libraryRef="DB2JCC4Lib"/>
        <properties.db2.jcc databaseName="CHTEST2" password="{xor}MzhmJT06ajI=" portNumber="60112" serverName="server.com" sslConnection="false" user="dbUser"/>
        <containerAuthData password="{xor}MzhmJT06ajI=" user="dbUser"/>
    </dataSource>

    <dataSource id="CHTEST2_RO" jndiName="jdbc/nextgen_RO" type="javax.sql.XADataSource">
        <jdbcDriver libraryRef="DB2JCC4Lib"/>
        <properties.db2.jcc databaseName="CHTEST2" password="{xor}MzhmJT06ajI=" portNumber="60112" serverName="server.com" sslConnection="false" user="dbUser"/>
        <containerAuthData password="{xor}MzhmJT06ajI=" user="dbUser"/>
    </dataSource>
<!-- More in file, but no included...-->
</server>

這是我的persistence.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
          http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
        version="2.0">
    <persistence-unit name="CHService" transaction-type="JTA">
    <jta-data-source>jdbc/nextgen</jta-data-source>
    <exclude-unlisted-classes>true</exclude-unlisted-classes>
    <properties>
        <property name="openjpa.jdbc.TransactionIsolation" value="read-uncommitted" /></properties></persistence-unit>
    <persistence-unit name="CHServiceRO" transaction-type="JTA">
        <jta-data-source>jdbc/nextgen_RO</jta-data-source>
        <exclude-unlisted-classes>true</exclude-unlisted-classes>
        <properties>
            <property name="openjpa.jdbc.TransactionIsolation" value="read-uncommitted" />
</properties>
</persistence-unit>
</persistence>

*我相信我們完全依靠注入來獲取JPA jndi查找的上下文,但是那是因為我在代碼中看不到任何針對JPA特定JNDI名稱的初始上下文的調用。 以下是我從EJB項目獲得的兩個帶注釋的會話Bean:

一種。 CHService Bean:

    @Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
@Local({ CHServiceLocal.class })
@Remote({ CHServiceRemote.class })
@Interceptors({ CHServiceLog.class })
@Resources({
        @Resource(name = "jdbc/nextgen", mappedName = "jdbc/nextgen", authenticationType = AuthenticationType.APPLICATION, shareable = true, type = javax.sql.DataSource.class),
        @Resource(name = "services/cache/CHBluepages", mappedName = "services/cache/CHBluepages", authenticationType = AuthenticationType.APPLICATION, shareable = true, type = com.ibm.websphere.cache.DistributedMap.class),
        @Resource(name = "services/cache/CHGeneric", mappedName = "services/cache/CHGeneric", authenticationType = AuthenticationType.APPLICATION, shareable = true, type = com.ibm.websphere.cache.DistributedMap.class) })
public class CHServiceBean extends AbstractCHServiceImpl implements
        CHService {

    @PersistenceContext(unitName = "CHService")
    private EntityManager em;

b。 CHServiceRO bean:

@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
@Local({CHServiceLocalRO.class})
@Remote({CHServiceRemoteRO.class})
@Interceptors({CHServiceROLog.class})
@Resources({
    @Resource(name="jdbc/nextgen_RO", mappedName="jdbc/nextgen_RO", authenticationType=AuthenticationType.APPLICATION, shareable=true, type=javax.sql.DataSource.class),
    @Resource(name="jdbc/nextgen", mappedName="jdbc/nextgen", authenticationType=AuthenticationType.APPLICATION, shareable=true, type=javax.sql.DataSource.class),
    @Resource(name="services/cache/CHBluepages", mappedName="services/cache/CHBluepages", authenticationType=AuthenticationType.APPLICATION, shareable=true, type=com.ibm.websphere.cache.DistributedMap.class),
    @Resource(name="services/cache/CHGeneric", mappedName="services/cache/CHGeneric", authenticationType=AuthenticationType.APPLICATION, shareable=true, type=com.ibm.websphere.cache.DistributedMap.class)
})
public class CHServiceBeanRO implements CHServiceRO {

    @PersistenceContext (unitName="CHServiceRO") private EntityManager em;

    private CHServiceBase ch;

    @PostConstruct
    private void init() { ch = new CHServiceBase(em); }

這是調用JPA應用程序的前端應用程序的Web.xml中的片段:

<resource-ref id="ResourceRef_1436377001246">
        <res-ref-name>jdbc/nextgen</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Application</res-auth>
        <res-sharing-scope>Shareable</res-sharing-scope>
    </resource-ref>
    <resource-ref id="ResourceRef_1436377001247">
        <res-ref-name>jdbc/nextgen_RO</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Application</res-auth>
        <res-sharing-scope>Shareable</res-sharing-scope>
    </resource-ref>

基於Gas對此主題的帖子: java.lang.ClassCastException,通過JNDI查找獲取Entitymanager

我還嘗試使用以下條目更新web.xml:

<persistence-unit-ref>
  <persistence-unit-ref-name>chJPA</persistence-unit-ref-name>
  <persistence-unit-name>CHService</persistence-unit-name>
</persistence-unit-ref>
<persistence-unit-ref>
  <persistence-unit-ref-name>chJPA_RO</persistence-unit-ref-name>
  <persistence-unit-name>CHServiceRO</persistence-unit-name>
</persistence-unit-ref>

和Bean代碼,其中包含:

@PersistenceContext(name = "chJPA", unitName = "CHService")

@PersistenceContext (name="chJPA_RO", unitName="CHServiceRO")

只是使用不同的jndi名稱而遇到相同的錯誤,即CHServiceBean com .......等的java:comp / env / chJPA類型為javax.persistence.EntityManager的引用。

最后,根據這篇文章: 訪問EntityManager時出錯-openjpa-WAS自由概要文件似乎我可能沒有完整的JavaEE 7功能並無法運行JPA 2.0? 請指教!

就像您在文章中所提到的那樣-您不能將<feature>javaee-7.0</feature>與JPA 2.0一起使用,因為它啟用了2.1,這就是為什么會有沖突的原因。

因此,您有2個選擇:

  • 要么使用Java EE7和JPA 2.1
  • 或僅啟用必需的Java EE 6功能,然后使用JPA 2.0

由於您要從WAS 8.0(目前不支持Java EE7)進行遷移,因此更容易的選擇是使用第二個選項。 因此,請嘗試刪除javee-7.0功能,並添加ejbLite-3.1jpa-2.0以及您需要的其他內容。

您正確地說,您不能具有javaee-7.0和JPA 2.0功能,因為它啟用了JPA 2.1功能。 因此,加斯給出的答案是正確的。

我只是想指出一下,因為您說過您確實希望最終使用JPA 2.1,一旦解決了日食問題,就應該使用WebSphere Application Server遷移工具包來識別從JPA 2.0遷移到JPA時需要的應用程序更改。 2.1。 Liberty JPA 2.0實現基於OpenJPA構建,而JPA 2.1實現基於EclipseLink構建。 可以從wasdev上免費下載遷移工具包: https : //developer.ibm.com/wasdev/downloads/#asset/tools-WebSphere_Application_Server_Migration_Toolkit

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM