当前位置: 首页 > 知识库问答 >
问题:

OSGi使用另一个捆绑包中的jpa持久化单元?

东方灵均
2023-03-14

我在Apache Felix中使用ServiceMix,我的企业应用程序由几个捆绑包组成。例如,我有一个带有jpa实体类的捆绑包,另一个带有业务逻辑和道类的捆绑包。因为我使用OpenJPA,实体捆绑包项目需要META-INF文件夹中的persistenc.xml在编译时进行字节码注入,但此捆绑包通过捆绑包清单中的元持久标头提供持久化单元。在道提供捆绑包内,我通过使用blueprint.xml注入实体管理器:

<bean id="systemUserDAOBean" class="server.daos.SystemUserDAO">
  <tx:transaction method="*" value="Required" /> 
  <jpa:context property="entityManager" unitname="mypu" />
</bean>

如果在运行时调用dao的以下方法:

public SystemUser readSystemUser(String username) {
        final EntityManager em = getEntityManager();
        final Query q = em.createQuery("select a from SystemUser a where a.username = '"+username+"'");
        return (SystemUser) q.getSingleResult();
}

将引发ClassCastException:

Java语言lang.ClassCastException:mypackage。无法将SystemUser转换为mypackage。系统用户

到目前为止,我发现加载entitymanager返回对象类的类加载器与加载方法返回类型的类加载器不同。也许第一个类加载器是实体包的类加载器,第二个是dao提供包的类加载器?!

如果我将persistence.xml复制到DAO-Bundle中并在blueprint.xml中使用其持久性单元,则不会抛出ClassCastException。但在这种情况下,我在同一个应用程序中有两个相同的persistence.xml文件,这是我不想要的。:(

有人知道如何解决这个问题吗?

谢谢你,菲尔

编辑:当我重新启动servicemix时,异常消失,直到我更新持久性捆绑包。我发现,这两个类加载器都来自持久性包。

共有1个答案

赵辉
2023-03-14

听起来您已经将域类(我想包括,SystemUser)复制到了多个bundle中。您不应该这样做,因为正如您所发现的那样,Java将不同类加载器加载的同一个类视为不同的类,因此您会得到ClassCastException。

您应该使用导出包头从一个包中导出域包。这可能应该从持久性包中完成。所有其他捆绑包都应导入该包。

 类似资料:
  • 我正在将我的spring-java项目转移到OSGi。 我有一些依赖项,这些依赖项在spring ebr repo或maven repo中不能作为包提供。处理它们的最佳方法是什么? null

  • 我试图在Felix中添加一个新的OSGI包(没有Karaf)作为ActiveMQ客户端(消息发送方)。 ActiveMQ客户端在非OSGI环境中运行良好。但当我在Felix中使用相同的代码(稍加修改)时,它会抛出以下错误: org.osgi.framework.捆绑异常:无法解决com.packtpub.felix.bookshelf-库存-impl-mock[7](R 7.3):缺少需求[com

  • 我使用EclipseIndigo使用OSGiJava框架开发了一些包。有一个主捆绑包,它依赖于其他捆绑包,并且具有要运行的主程序。如果我尝试在Eclipse中运行所有捆绑包,一切都正常工作,但是如果我将每个捆绑包保存为一个JAR,并在命令行中启动OSGi框架,当我尝试启动主捆绑包时,会出现异常<code>NoClassDefFoundError。找不到的类是依赖项。包的其余部分处于活动状态,主包刚

  • 问题内容: OSGi无法找到我的DLL文件,而且我似乎也找不到原因。 目前,我的包根目录中有DLL文件(),我也尝试将其放在目录中。 有关捆绑商品的清单看起来像这样: 然后在我的JNA界面中,执行loadLibrary(根据文档): 然后在另一个类中,我尝试使用JNA接口 我通过另一个捆绑软件提供了JNA(该捆绑软件输出com.sun.jna和上面导入的其他软件包),但也尝试过使用此处定义的捆绑软

  • 简单的OSGi应用程序与包内的依赖关系。 我在玩karaf。我从写一个简单的Rest应用程序开始。https://github.com/YaroslavTir/osgi-jersey-hibertate/tree/stackoverflow/examples/karaf-rest-core 我将karaf示例作为backbond,使用restendpoint运行我的第一个包非常简单,但是当我添加m

  • 我在试图限制OSGi捆绑包可以执行的操作时遇到了一个问题。根据我阅读的文档,OSGi捆绑包的权限应该在OSGi-INF/permissions中设置。perm文件位于bundle的JAR中。然而,无论我在该文件中写了什么(无论该文件是否存在),bundle似乎都拥有所有权限。更具体地说,我使用命令行启动OSGi 然后我用命令安装捆绑包 和启动它。当我试图执行一个操作t