Java 带有@OSGiService的EJB名称

Java 带有@OSGiService的EJB名称,java,jakarta-ee,ejb,osgi,cdi,Java,Jakarta Ee,Ejb,Osgi,Cdi,这么简单的问题,但我在谷歌上找不到答案。我在glassfish4上有两个osgi捆绑包: Bundle1-Servlet Bundle2-MyEJB1,MyEJB2。这两个EJB都是本地的、无状态的,实现了相同的接口(MyLocalInterface),每个EJB都有自己的接口 名字 在servlet中,我像这样注入EJB: @Inject @OSGiService (dynamic = true) private MyLocalInterface ejb; 如何通过名称区分这两个用于注入的E

这么简单的问题,但我在谷歌上找不到答案。我在glassfish4上有两个osgi捆绑包:

  • Bundle1-Servlet
  • Bundle2-MyEJB1,MyEJB2。这两个EJB都是本地的、无状态的,实现了相同的接口(MyLocalInterface),每个EJB都有自己的接口 名字
  • 在servlet中,我像这样注入EJB:

    @Inject @OSGiService (dynamic = true)
    private MyLocalInterface ejb;
    
    如何通过名称区分这两个用于注入的EJB?我认为我应该在@OSGiService中使用serviceCriteria,但如何使用呢

    编辑:
    我有很多osgi服务(不是ejb,简单的osgi服务)都具有相同的接口。为了区分它们,我使用

    @Inject @OSGiService(dynamic=true, serviceCriteria = "(component.name=com.bla.bla)"). 
    
    我也需要ejb

    EDIT2:
    到目前为止,我发现的唯一方法是使用jndi名称,因为两个cdi bean都是EJB:

    @Inject @OSGiService(dynamic=true, serviceCriteria = "(jndi-name=java:global/....)"). 
    
    小心!没有“()”就不行!
    但是如果我们解决这个问题,这个解决方案可能会更好:

    只需使用注释即可。标准中已经定义了它。

    您的意思是注入名为(“myname”)的OSGiService吗?您能提供我的servlet的代码示例吗?它至少在同一个CDI模块中使用@Inject@Named(“myname”)。不确定这是否也适用于捆绑包之间。如果在本例中其他限定符注释对您有效,那么这个注释也应该有效(如您在注释中所示)。在一个bundle中,我认为它可以工作,但在bundle之间不行。我发现您需要在清单中使用“Export EJB:ALL”将CDIBean导出为OSGi服务。我还没有找到消除歧义的方法。您可以尝试使用一些限定符和@Named并检查OSGi服务获得的属性吗?对于PaxCDI,计划在限定符注释和OSGi服务属性之间提供映射器。我不确定glassfish是否也有这个功能。我不确定glassfish是如何公开OSGi服务的。您能否尝试在OSGi级别检查设置了哪些服务属性?然后可以在serviceCriteria中查询这些属性。