- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在研究 ServiceMix 5.4.0 和 OSGi,并且遇到了 OpenJPA 的一个相当奇怪的行为。
我有一个这样定义的数据源:
<blueprint
xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="org.postgresql.Driver"/>
<property name="url" value="jdbc:postgresql://localhost:5432/test"/>
<property name="username" value="test"/>
<property name="password" value="test"/>
</bean>
<service interface="javax.sql.DataSource" ref="dataSource">
<service-properties>
<entry key="osgi.jndi.service.name" value="jdbc/test"/>
</service-properties>
</service>
</blueprint>
使用 jndi:names 命令,我可以验证数据源是否可见:
karaf@root> jndi:names
JNDI Name Class Name
osgi:service/jndi org.apache.karaf.jndi.internal.JndiServiceImpl
osgi:service/jdbc/test org.apache.commons.dbcp.BasicDataSource
karaf@root>
我的 persistence.xml:
<persistence version="2.0" 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">
<persistence-unit name="test" transaction-type="JTA">
<jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/test)</jta-data-source>
<class>com.example.persistence.security.User</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="openjpa.jdbc.DBDictionary" value="postgres"/>
<property name="openjpa.Log" value="slf4j"/>
</properties>
</persistence-unit>
</persistence>
然后我通过蓝图将持久化单元注入(inject)到 DAO 类中:
<?xml version="1.0" encoding="UTF-8"?>
<blueprint default-activation="eager"
xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:jpa="http://aries.apache.org/xmlns/jpa/v1.0.0"
xmlns:tx="http://aries.apache.org/xmlns/transactions/v1.0.0">
<bean id="securityDAO" class="com.example.security.dao.SecurityDAOImpl" init-method="init">
<tx:transaction method="*" value="Required" />
<jpa:context property="entityManager" unitname="test" />
</bean>
<service ref="securityDAO" interface="com.example.security.dao.SecurityDAO">
</service>
</blueprint>
持久化单元注入(inject)成功,我在DAO的init-method中验证:
public void init() {
if (em==null) {
log.error("Entity manager not found. Check JPA configuration.");
throw new RuntimeException("No EntityManager found");
}
log.info("Started SecurityDAO");
}
在我所有的辛勤工作之后,当我从另一个 bean 调用我的 DAO 方法时,ServiceMix 奖励我以下神秘异常:
....
public void setSecurityDAO (SecurityDAO dao) {
this.dao = dao;
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String userName = req.getParameter("userName");
String password = req.getParameter("password");
// Invocation of injected DAO results in exception
User u = dao.authenticateUser(userName, password);
结果如下:
Caused by: java.lang.RuntimeException: The DataSource osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/test) required by bundle persistence/0.0.1.SNAPSHOT could not be found.
at org.apache.aries.jpa.container.unit.impl.JndiDataSource.getDs(JndiDataSource.java:87)
at org.apache.aries.jpa.container.unit.impl.DelayedLookupDataSource.getConnection(DelayedLookupDataSource.java:36)
at org.apache.openjpa.lib.jdbc.DelegatingDataSource.getConnection(DelegatingDataSource.java:116)
at org.apache.openjpa.lib.jdbc.DecoratingDataSource.getConnection(DecoratingDataSource.java:93)
at org.apache.openjpa.jdbc.schema.DataSourceFactory.installDBDictionary(DataSourceFactory.java:233)
... 54 more
Caused by: javax.naming.NoInitialContextException: Unable to find the InitialContextFactory org.eclipse.jetty.jndi.InitialContextFactory.
at org.apache.aries.jndi.ContextHelper.getInitialContext(ContextHelper.java:148)
at org.apache.aries.jndi.OSGiInitialContextFactoryBuilder.getInitialContext(OSGiInitialContextFactoryBuilder.java:49)
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:684)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:313)
at javax.naming.InitialContext.init(InitialContext.java:244)
at javax.naming.InitialContext.<init>(InitialContext.java:216)
at org.apache.aries.jpa.container.unit.impl.JndiDataSource.getDs(JndiDataSource.java:64)
... 58 more
不知何故,OSGi 导出的数据源没有找到进入持久性包的方式。奇怪的是,当我将以下代码添加到 init-method 中以查看是否可以执行测试查询时,OpenJPA 不仅没有在 init 方法中抛出异常,现在触发异常的 DAO 的调用也适用:
public void init() {
if (em==null) {
log.error("Entity manager not found. Check JPA configuration.");
throw new RuntimeException("No EntityManager found");
}
try {
Query q = em.createNativeQuery("SELECT 1=1");
q.getFirstResult();
} catch (Exception ex) {
log.error("Unable to execute test query against database", ex);
throw new RuntimeException(ex);
}
log.info("Started SecurityDAO");
}
因此,总结一下:如果我从与我的 DAO 不同的包中调用方法,OpenJPA 会抛出一个异常,指示它找不到 InitialNamingContext,并且不会在日志中显示它已启动的任何指示。如果我在外部组件调用它之前在我的 DAO 中执行查询,OpenJPA 能够以某种方式找到 InitialNamingContext,OpenJPA 出现在日志中,随后来自 DAO 包外部的调用开始工作。
显然,我在这里遗漏了一些基本的东西。非常感谢任何有关问题或我做错了什么的帮助或深思熟虑的解释。
编辑:
昨晚我没有注意到,但是当我在测试查询中添加时,日志中出现了以下几行。当我注释掉该查询时,它们不存在:
... | Runtime | 220 - org.apache.openjpa - 2.3.0 | Starting OpenJPA 2.3.0
... | JDBC | 220 - org.apache.openjpa - 2.3.0 | Using dictionary class "org.apache.openjpa.jdbc.sql.PostgresDictionary".
... | JDBC | 220 - org.apache.openjpa - 2.3.0 | Connected to PostgreSQL version 9.9 using JDBC driver PostgreSQL Native Driver version PostgreSQL 9.3 JDBC4.1 (build 1102).
编辑 2:
在普通的 Vanilla Karaf 3.0.3 上试过,得到了同样的错误。作为解决方法,我在执行上述测试查询的包中创建了一个单独的 bean。显然,只要 bundle 中的单个 bean 在 bundle 外的 bean 尝试调用之前调用 OpenJPA,OpenJPA 就会正确初始化。
由于在 OpenJPA/ServiceMix 文档中我看不到这一点,所以我只能假设我在配置的其他地方做错了什么。
编辑 3:
Per John Forth,这里是 MANIFEST.MF
Manifest-Version: 1.0
Bnd-LastModified: 1430533396366
Build-Jdk: 1.8.0_45
Built-By: somedude
Bundle-Blueprint: OSGI-INF/blueprint/blueprint.xml
Bundle-Description: Database access layer for Peer Review product
Bundle-ManifestVersion: 2
Bundle-Name: Example :: Persistence
Bundle-SymbolicName: persistence-jpa
Bundle-Version: 0.0.1.SNAPSHOT
Created-By: Apache Maven Bundle Plugin
Export-Package: com.example.persistence.security;version="0.0.1.SNAPSHOT",co
m.example.security.dao;version="0.0.1.SNAPSHOT";uses:="com.example.persistence.
security,javax.persistence"
Export-Service: com.example.security.dao.SecurityDAO
Import-Package: javax.persistence;version="[1.1,2)",org.osgi.service.blu
eprint;version="[1.0.0,2.0.0)",org.slf4j;version="[1.7,2)"
Meta-Persistence: META-INF/persistence.xml
Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.7))"
Tool: Bnd-2.3.0.201405100607
并且,由于它可能与 JPA 包的 pom.xml 相关:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>example</artifactId>
<groupId>com.example</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>persistence-jpa</artifactId>
<packaging>bundle</packaging>
<name>Example :: Persistence</name>
<dependencies>
<dependency>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-jpa_2.0_spec</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.7</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>2.5.3</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Meta-Persistence>META-INF/persistence.xml</Meta-Persistence>
<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
<Bundle-Version>${project.version}</Bundle-Version>
<Import-Package>*</Import-Package>
<Export-Package>com.example.persistence*,com.example.security.*;version=${project.version}</Export-Package>
</instructions>
</configuration>
</plugin>
</plugins>
</build>
</project>
最佳答案
如果您使用的是 OSGI,则类可见性在 MANIFEST.MF 文件中定义。
因此持久性包只能看到和加载在其 MANIFEST.MF 中导入的类。
扩展现有包的正确方法是定义附加到现有包的片段。通过这种方式,您可以提供类(例如 DAO)和文件(例如 persistence.xml)并使片段主机可见。
然后 MANIFEST.MF 看起来像
Bundle-ManifestVersion: 2
Bundle-Name: foo.bar.openjpa-fragment
Bundle-SymbolicName: foo.bar.openjpa-fragment;singleton:=true
Bundle-Version: 0.0.1.SNAPSHOT
Bundle-Vendor: foo bar
Fragment-Host: org.apache.openjpa-bundle
Bundle-ClassPath: .
请注意,这只是一个示例。
OSGI 意味着提供适当的可见性。
您可以将多个片段添加到现有的包中,例如将配置保存在单独的包中,这样可以更轻松地切换配置。
关于java - ServiceMix 找不到 OSGI 数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29838372/
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 提供事实和引用来回答它. 8年前关闭。 Improve this
CentOS可以安装Apache Servicemix吗?如果是,有什么要求? 最佳答案 它是一个Java应用程序,所以要求是一个JDK。 关于installation - 是否可以在CentOS中安
我正在尝试配置 Apache ServiceMix 4 以提供其文档中提到的负载平衡功能(例如: http://servicemix.apache.org/clustering.html )。虽然提到
我正在尝试遵循一个简单的教程,使用蓝图将简单的 CRUD 接口(interface)公开为 REST 服务 github link to tutorial code 部署到 serviceMix 时,
命令: feature:install spring-jdbc/4.3.5.RELEASE_1 导致我的 Servicemix 7.0.1 实例无限期卡住,而相同的命令(功能版本较低)在 Servic
在 ServiceMix 容器(FuseESB 编译)上升级库的过程是什么? 我使用的是 Fuse 版本 4.4.1,它使用的是 Spring 3.0.5。新版本的Spring已经可用,那么,当我想使
大家好,我几天前开始使用 Apache ServiceMix,但找不到任何好的教程。我有一个 Java 项目,现在我想在 ServiceMix 中运行它,但我不知道该怎么做?我也想知道如何连接两个服务
我正在运行 Apache servicemix 4.5.2。我想安装一个功能,即一个 jar 文件。我想要的功能是 jtidy . pom依赖为: jtidy jtidy 4
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
有人使用 Karaf 而不是 Servicemix 吗?如果是这样,您是如何做出这个决定的?我知道Servicemix在Karaf周围添加了一层功能,只是好奇Karaf是否单独使用以及为什么.....
我一直在研究 ServiceMix 5.4.0 和 OSGi,并且遇到了 OpenJPA 的一个相当奇怪的行为。 我有一个这样定义的数据源:
我们在生产中有一个 apache servicemix 实例(版本 3.3.1),它运行我们的 bpel 流程(使用 apache ode 1.3.5 )和一些 Camel 代码(用于路由)。问题是,
我们拥有在 Servicemix 5 上完美运行的 osgi 应用程序。但由于某些原因,我们必须迁移到 Servicemix 4.5。我尝试了一下,得到了这个 Error parsing SQL Ma
我们正在尝试使用 Apache Felix 网桥 (org.apache.felix.http.bridge-4.0.0.jar) 将在 Apache Tomcat 8.5.3 上运行的 Web 应用
ESB 专家,需要一些帮助。我被困在 apache servicemix(v 4.5.3) 中。该场景是我们的企业应用程序之间的通信,包括一个已经在 tomcat 上执行的 Web 应用程序。两个应用
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
我开始使用 ServiceMix 和 Camel,并且我已经运行了许多示例。 似乎OSGi的例子可以通过热部署或控制台部署在ServiceMix中,但我不知道如何部署一个不是OSGI的项目。可以做到吗
我有 ServiceMix 4.5.3,想完全禁用内部/嵌入式 ActiveMQ 代理。实现该目标的最佳/最简单方法是什么? 最佳答案 测试和工作: 从 featuresBoot 列表中删除 "act
我有 servicemix 版本: 4.3.1-fuse-03.01 与 Camel 2.6.0-fuse-03-01。 我想将 Camel 升级到 2.8.0 版。在不升级整个 Servicemix
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我是一名优秀的程序员,十分优秀!