Java 带有@OSGiService的EJB名称
这么简单的问题,但我在谷歌上找不到答案。我在glassfish4上有两个osgi捆绑包: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
@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中查询这些属性。