OSGI:从ServiceListener获取对EJB的引用
我使用OSGI、Weld和Glassfish3.1 我有一个带有ServiceListener的OSGI模块。在ServiceListener中,我需要将注册的服务输入到我的数据库中。 最初我想写一个去DB的EJB,在ServiceListener中添加查找/EJB注入,这将带来EJB EJB EJB和ServiceListener在同一个包中。 但是,查找/EJB注入不起作用:OSGI:从ServiceListener获取对EJB的引用,osgi,glassfish-3,cdi,ejb-3.1,Osgi,Glassfish 3,Cdi,Ejb 3.1,我使用OSGI、Weld和Glassfish3.1 我有一个带有ServiceListener的OSGI模块。在ServiceListener中,我需要将注册的服务输入到我的数据库中。 最初我想写一个去DB的EJB,在ServiceListener中添加查找/EJB注入,这将带来EJB EJB EJB和ServiceListener在同一个包中。 但是,查找/EJB注入不起作用: @EJB private AdminService adminService; 我还尝试将EJB作为OSG
@EJB
private AdminService adminService;
我还尝试将EJB作为OSGI服务,但没有成功。
有没有办法解决这个问题?也许我不应该和ServiceListener一起做
多谢各位
UPD:我找到了一种解决方案:添加一个注入DAO服务的启动单例EJB,并向OSGI添加一个侦听器,但它从激活器的静态成员获取bundleContext。
但它有时抛出一个不活动的非法状态异常bundleContext我找到了一种解决方案:添加一个注入DAO服务的启动单例EJB,并向OSGI添加一个侦听器。 但是我仍然很好奇是否有更好的方法您需要声明导出EJB:ALL in MENIFEST.MF,将所有EJB导出为服务,然后您可以使用@OSGiService获取服务,有关详细信息,请参考
希望这能帮助你你应该在这个问题上添加glassfish标签。服务和EJB之间的集成是Glassfish特有的特性,因此通过适当地标记它,您可能会吸引了解Glassfish的人的注意。
private class MyServiceListener implements ServiceListener {
private AdminService adminService;
public MyServiceListener(){
adminService = (AdminService) ctx.lookup("java:global/com.war_1.0.0.SNAPSHOT/AdminService");
...
}
public synchronized void serviceChanged(ServiceEvent event) {
switch (event.getType()) {
case ServiceEvent.REGISTERED:
ServiceReference reference = event.getServiceReference();
adminService.installService(...);
break;
default:
break;
}
}