[英]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);
而我希望能夠在運行時切換實現並使用SOAPClient
或JMSClient
具體取決於代碼當前運行的應用程序。 理想情況下,框架將從可用的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.