当前位置: 首页 > 知识库问答 >
问题:

JAXRS资源中的Jersey CDI注入

奚瑾瑜
2023-03-14

免责声明:我刚刚开始使用OSGI,所以请忍受我和我的知识不足...

为了本练习,假设我有一个基于泽西岛 (2.17.0) 的 REST 应用程序在 OSGI 环境中的 Jetty (9.2.10) 下运行,它为用户提供了一些通过 SOAP 从单独的服务器收集的统计信息。

我现在尝试在另一个应用程序中重用一些现有代码,该应用程序应该通过JMS(或其他东西)检索统计信息。

我的目的是在捆绑包中为客户端 API 引入一个抽象层,为每个应用程序实现一个具有适当通信通道的捆绑包,并使用 CDI 在运行时将客户端注入到我的 REST 资源中。例如:

REST资源(捆绑包1,两个应用程序通用)

@Path("statistics")
public class StatisticsResource {

    @Inject
    private StatisticsClient client;

    @GET
    @Path("users")
    public List<User> getActiveUsers(){
        return client.getActiveUsers();
    }
}

通用 API(捆绑包 2,两个应用都通用)

public interface StatisticsClient {
    List<User> getActiveUsers();
}

SOAP实现(应用程序1的捆绑包3)

@ApplicationScoped
public class SOAPClient implements StatisticsClient {
    @Override
    public List<User> getActiveUsers() {
        // connect to server via SOAP
    }
}

JMS实现(应用程序2的捆绑包3)

@ApplicationScoped
public class JMSClient implements StatisticsClient {
    @Override
    public List<User> getActiveUsers() {
        // connect to server via JMS
    }
}

我一直在阅读和搜索关于如何将injection与Jersey、HK2 (2.4.0)和OSGI一起使用的信息,但我迄今为止还没有找到与上述想法相匹配的相关信息。

到目前为止,我看到的大多数Jersey CDI注入示例都使用具体的类来定义绑定,比如< code>bind(MyService.class)。to(my service . class);鉴于我希望能够在运行时切换实现,并根据代码当前运行的应用程序使用< code>SOAPClient或< code>JMSClient。理想情况下,框架将从可用的OSGI服务(或者类路径或类似的东西)中推导/检测实现...

这可行吗?如果可行,我错过了什么?或者,我可能误解或错过了什么基本概念?

共有1个答案

段干博涉
2023-03-14

您可以使用带有CDI生产者的简单EJB(生产者注入bean,或者产生要注入的bean实例,这取决于一些标准)。

伪代码:

public interface Service;

@Stateless
@ServiceImplementation(A)  //Qualifier *
public class ServiceImplA implements Service{
    //impl code
}

@Stateless
@ServiceImplementation(B)    //Qualifier *
public class ServiceImplB implements Service{
    // impl code
}

@Produces 
@ApplicationScoped
public Service produceServiceInstances(){
    if(condition)
       return ServiceImplA
    else
       return ServiceImplB
}

检查这个链接https://docs.oracle.com/javaee/7/tutorial/cdi-adv003.htm

 类似资料:
  • 需要使用 Jax-Rs Jersey-1.x 资源提供文件上传功能。我想知道是否最好使用“File”作为参数或“InputStream”创建方法? 资源将接受内容类型,并且不绑定到表单数据。它将需要处理小到大(最多千兆)的文件。 想知道使用<code>InputStream

  • Java 元数据(Metadata)规范(JSR-175),是J2SE 5.0和更高版本的一部分,提供一种在Java代码中指定配置数据的方法。Java代码中的元数据也被称为注解。在JavaEE中,注解用于声明对外部资源的依赖和在Java代码中的配置数据而无需在配置文件中定义该数据。 本节描述了在Java EE技术兼容的Servlet容器中注解和资源注入的行为。本节扩展了Java EE规范第5节标题

  • 我需要编写一个无状态会话bean,并将其部署到WLS10.3。3.会话bean应该能够向通过WLS控制台创建的已知JMS队列发送文本消息。因此,我编写了以下代码: 我现在需要做的是提供一个有效的weblogic-ejb-jar.xml与资源参考到jndi-name映射。有人能为weblogic-ejb-jar.xml提供一个例子吗? jmsConnectionFactory应该绑定到jndi-na

  • void unregister_resource(string name) Use this to dynamically unregister a resource plugin. Pass in the name of the resource. 动态注销一个资源插件,参数是资源的名称。 Example 13-27. unregister_resource 例子 13-27. 注销资源 $sm

  • void register_resource(string name, array resource_funcs) Use this to dynamically register a resource plugin with Smarty. Pass in the name of the resource and the array of PHP functions implementing i

  • 我正在泽西岛应用程序中使用 CDI。在根资源上,CDI 注入按预期工作,但每当我返回子资源时,CDI 注入源都不可用。 具有子资源定位器的根资源: 子资源: 错误: 我正在使用和Weld依赖项,在Undertow上运行,并将Weld servlet侦听器添加到部署中。 同样,对根资源的相同注入确实有效。< code>@Named("name ")字符串由< code>@ApplicationSco