首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在WebSphere中注入时出错

在WebSphere中注入时出错
EN

Stack Overflow用户
提问于 2016-04-05 19:17:39
回答 1查看 2.9K关注 0票数 0

我继承了一个遗留应用程序,最初是用WebSphere 6.1构建的,然后迁移到WebSphere 8.0,运行JPA2.0和openJPA,没有问题。出于战略原因,我们正在向WebSphere自由迁移。我们首先在WebSphere经典8.5.5.8和JPA上进行了测试,而实体管理器在那里没有问题。然而,关于自由8.5.5.8,我得到以下例外:

java:comp/env/com.xxx.xxxx.service.CHServiceBean/em :javax.ejb.EJBException应用程序的CHServiceEJB.jar模块中的CHServiceBean组件的javax.persistence.EntityManager类型的javax.persistence.EntityManager引用无法解析。在com.ibm.wsspi.injectionengine.InjectionBinding.getInjectionObject(InjectionBinding.java:1493) .由: err javax.ejb.EJBException引起的err :不能解析javax.ejb.EJBException应用程序的CHServiceEJB.jar模块中CHServiceBean组件的javax.persistence.EntityManager类型的CHServiceBean引用。在内部类中的com.ibm.wsspi.injectionengine.InjectionBinding.getInjectionObject(InjectionBinding.java:1493)错误

我遇到了另一个EJB注入问题,这个问题通过绑定文件的配置得到了解决,但是我无法解决这个问题。我有两个应用程序,每个应用程序都有自己的EAR文件,但都运行在相同的自由JVM中。应用程序A运行前端/UI逻辑,而应用程序B是后端EJB / JPA接口。在项目方面,JPA应用程序被设置为2.0 (我想要2.1,但是基于另一个线程,JPA2.0和EJB3.1是尽可能高的,我在这里的另一个线程主题是->Eclipse Juno and JPA 2.1 support)。

这是我的server.xml文件:

代码语言:javascript
复制
    <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文件:

代码语言:javascript
复制
<?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>

我*相信我们完全依靠注入来获取jndi查找的上下文,但这是因为在我们的代码中看不到对任何JPA特定JNDI名称的初始上下文的调用。下面是我来自EJB项目的两个模拟会话bean:

a. CHService豆:

代码语言:javascript
复制
    @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豆:

代码语言:javascript
复制
@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); }

下面是前端应用程序的Web.xml调用JPA应用程序的片段:

代码语言:javascript
复制
<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,Getting Entitymanager Via JNDI Lookup

我还尝试用以下条目更新web.xml:

代码语言:javascript
复制
<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代码,其中包括:

代码语言:javascript
复制
@PersistenceContext(name = "chJPA", unitName = "CHService")

代码语言:javascript
复制
@PersistenceContext (name="chJPA_RO", unitName="CHServiceRO")

获得相同的错误,只需使用不同的jndi名称,即java:comp/env/chJPA引用类型为javax.persistence.EntityManager的CHServiceBean com.......etc等。

最后,根据这篇文章:Error while accessing EntityManager - openjpa - WAS liberty profile,也许我不能拥有完整的JavaEE 7特性并运行JPA2.0?请指点!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-05 19:35:21

正如您在文章中所提到的-您不能将<feature>javaee-7.0</feature>与JPA2.0一起使用,因为它支持2.1,这就是为什么您有冲突。

所以你有两个选择:

  • 要么使用Java EE7和JPA2.1
  • 或者只是启用所需的Java 6特性,然后使用JPA2.0

由于您正在从WAS8.0迁移,而WAS8.0目前还不支持EE7,所以使用第二个选项可能更容易。因此,尝试删除javee-7.0特性,并添加ejbLite-3.1jpa-2.0以及任何需要更多内容的内容。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36435166

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档