OSGI:从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

我使用OSGI、Weld和Glassfish3.1

我有一个带有ServiceListener的OSGI模块。在ServiceListener中,我需要将注册的服务输入到我的数据库中。 最初我想写一个去DB的EJB,在ServiceListener中添加查找/EJB注入,这将带来EJB EJB EJB和ServiceListener在同一个包中。 但是,查找/EJB注入不起作用:

    @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;
            }
        }