gpt4 book ai didi

java - 如何以编程方式从 OSGI 蓝图中获取 bean?

转载 作者:行者123 更新时间:2023-11-29 04:30:02 29 4
gpt4 key购买 nike

出于测试目的,我想在 Apache Camel 应用程序的蓝图中获取 bean 的实例。

在 JUnit 测试中,我如何在下面的 daos.xml 中获取 bean 的实例,因为它们将存在于应用程序的 OSGI 容器中?

种类

AuditPageNavDao aDao = Daos.getInstance("auditPageNavDao");

我有一个带有插件的 Maven pom.xml:

<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-Name>DaoServicesCommon</Bundle-Name>
<Bundle-Activator>com.acme.dao.bundle.Activator</Bundle-Activator>
<Meta-Persistence>META-INF/persistence.xml</Meta-Persistence>
<Import-Package>
javax.persistence,
org.hibernate.proxy,
javassist.util.proxy,
*
</Import-Package>
</instructions>
</configuration>
</plugin>

META-INF/persistence.xml 看起来像

<?xml version="1.0" encoding="UTF-8" ?>
<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" xmlns="http://java.sun.com/xml/ns/persistence">

<persistence-unit name="appPU" transaction-type="JTA">
<jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/appxadb)</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
<property name="hibernate.enable_lazy_load_no_trans" value="true" />
<property name="show_sql" value="true" />
</properties>
</persistence-unit>

</persistence>

OSGI-INF/blueprint/daos.xml 看起来像

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:jpa="http://aries.apache.org/xmlns/jpa/v1.1.0" xmlns:tx="http://aries.apache.org/xmlns/transactions/v1.2.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
http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint-2.8.0.xsd
http://aries.apache.org/xmlns/transactions/v1.2.0 http://aries.apache.org/schemas/transaction/transactionv12.xsd
http://aries.apache.org/xmlns/jpa/v1.1.0 http://aries.apache.org/schemas/jpa/jpa_110.xsd">

<!-- AUDIT DAO SERVICES -->
<bean id="auditAccountTxnDao" class="com.acme.dao.audit.jta.AuditAccountTxnDaoImpl">
<argument index="0" ref="temporals" />
<jpa:context index="1" unitname="appPU" />
</bean>

<service interface="com.acme.dao.audit.jta.AuditAccountTxnDao"
ref="auditAccountTxnDao">
<service-properties>
<entry key="osgi.jndi.service.name" value="AuditAccountTxnDao" />
</service-properties>
</service>

<bean id="auditAuthDao" class="com.acme.dao.audit.jta.AuditAuthDaoImpl">
<argument index="0" ref="temporals" />
<jpa:context index="1" unitname="appPU" />
</bean>

<service interface="com.acme.dao.audit.jta.AuditAuthDao"
ref="auditAuthDao">
<service-properties>
<entry key="osgi.jndi.service.name" value="AuditAuthDao" />
</service-properties>
</service>

<bean id="auditPageNavDao" class="com.acme.dao.audit.jta.AuditPageNavDaoImpl">
<argument index="0" ref="temporals" />
<jpa:context index="1" unitname="appPU" />
</bean>

<service interface="com.acme.dao.audit.jta.AuditPageNavDao"
ref="auditPageNavDao">
<service-properties>
<entry key="osgi.jndi.service.name" value="AuditPageNavDao" />
</service-properties>
</service>

<bean id="auditTxnDao" class="com.acme.dao.audit.jta.AuditTxnDaoImpl">
<argument index="0" ref="temporals" />
<jpa:context index="1" unitname="appPU" />
</bean>

<service interface="com.acme.dao.audit.jta.AuditTxnDao"
ref="auditTxnDao">
<service-properties>
<entry key="osgi.jndi.service.name" value="AuditTxnDao" />
</service-properties>
</service>

<bean id="auditEventCodeDao" class="com.acme.dao.audit.jta.AuditEventCodeDaoImpl">
<argument index="0" ref="temporals" />
<jpa:context index="1" unitname="appPU" />
</bean>

<service interface="com.acme.dao.audit.jta.AuditEventCodeDao"
ref="auditEventCodeDao">
<service-properties>
<entry key="osgi.jndi.service.name" value="AuditEventCodeDao" />
</service-properties>
</service>

</blueprint>

最后激活器是

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

public class Activator implements BundleActivator
{

@Override
public void start(final BundleContext context) throws Exception
{
}

@Override
public void stop(final BundleContext context) throws Exception
{
}

}

最佳答案

这取决于您如何运行测试。有两种方式:

  • 使用 PAX EXAM,它将启动一个 OSGi 容器并在那里部署您的包
  • 使用 CamelBlueprintTestSupport 类作为测试的父类,这将启动一个小型嵌入式容器来运行 Camel

您可以使用 JUnit 或 TestNG 运行测试,测试框架无关紧要。另请注意,PAX EXAM 可以运行您选择的确切 JBoss Fuse 版本。

使用 PAX 考试

PAX EXAM 通过在容器内注入(inject)“探针包”来运行测试。将此探测包想象成正在运行的测试类的“副本”。所以在测试类中,您可以完全访问 OSGi 内部结构。
然后从 BundleContext 您可以向 OSGi 请求您注册的服务之一。
这是关于如何获取您的 auditPageNavDao bean 的粗略想法:

@RunWith(PaxExam.class)
class YourTest {
@javax.inject.Inject
protected BundleContext bundleContext_;

@Test
testMethod() {

ServiceReference<AuditPageNavDao> daoServiceReference_ = bundleContext_.getServiceReference(AuditPageNavDao.class);
AuditPageNavDao dao = bundleContext_.getService(daoServiceReference_);
// use DAO here

}
}

使用 Camel 蓝图测试支持

您可以轻松地与组件和端点进行交互,例如

MyBatisComponent mbc = context.getComponent("mydb", MyBatisComponent.class);
mbc.getSqlSessionFactory().openSession().getConnection();
// don't know if this will work
Object dao = context.getRegistry().lookupByName("auditPageNavDao");

我不知道如何获取蓝图 bean,可能是 CamelContext是一个很好的起点。

关于java - 如何以编程方式从 OSGI 蓝图中获取 bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44133381/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com