JAXRS资源中的Jersey CDI注入

时间:2016-11-08 13:14:32

标签: java jersey cdi osgi-bundle

免责声明:我刚刚开始使用OSGI,所以请耐心等待我和我缺乏知识......

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

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

我的目的是在bundle中为客户端API引入一个抽象层,使用适当的通信通道为每个应用程序实现一个bundle,并使用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
    }
}

我一直在阅读和搜索有关如何使用Jersey,HK2(2.4.0)和OSGI注射的信息,但到目前为止,我还没有找到符合上述想法的相关内容。

我到目前为止看到的大多数Jersey CDI注入examples,使用具体类定义绑定,例如bind(MyService.class).to(MyService.class);,而我希望能够在运行时切换实现并使用其中任何一个SOAPClientJMSClient取决于当前运行代码的应用程序。理想情况下,框架将从可用的OSGI服务(或类似路径或类似的东西)推断/检测实现......

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

1 个答案:

答案 0 :(得分:0)

您可以将简单的EJB与CDI生产者一起使用(生产者注入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