簡體   English   中英

JAXRS資源中的Jersey CDI注入

[英]Jersey CDI injection in JAXRS resource

免責聲明:我剛剛開始使用OSGI,所以請耐心等待我和我缺乏知識......


為了這個練習,假設我在OSGI環境中有一個在Jetty(9.2.10)下運行的基於Jersey(2.17.0)的REST應用程序,它為用戶提供了一些通過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注入示例都使用具體類來定義綁定,例如bind(MyService.class).to(MyService.class); 而我希望能夠在運行時切換實現並使用SOAPClientJMSClient具體取決於代碼當前運行的應用程序。 理想情況下,框架將從可用的OSGI服務(或類似路徑或類似的東西)推斷/檢測實現......

這是可行的,如果是的話,我錯過了什么? 或者,我可能誤解或錯過了什么基本概念?

您可以將簡單的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM