2012-11-12 100 views
0

我試圖使用CDI擴展在運行時發現JAX-RS資源,並在Java SE環境中的不同基本URI下自動發佈它們。如果可能,應用程序本身不需要擴展javax.ws.rs.core.Application以編程方式配置JAX-RS基本URI每次部署

我已閱讀RestEasy文檔和javadoc,但沒有找到任何明顯的方式在運行時修改@ApplicationPath。 ,即時通訊探索

一個想法是嘗試產生javax.ws.rs.core.Application和編程設置@ApplicationPath基URI,可能通過使用AnnotatedType CDI擴展和發佈,作爲一個* org.jboss.resteasy.spi.ResteasyDeployment`。

還有其他更好的方法嗎?

編輯:

試圖CDI擴展事件ProcessAnnotatedType改變的JAX-RS資源@javax.ws.rs.Path

<X> void process(@Observes ProcessAnnotatedType<X> pat) { 
    if (!pat.getAnnotatedType().isAnnotationPresent(javax.ws.rs.Path.class)) { 
    return; 
    } 
    final AnnotatedType<X> org = pat.getAnnotatedType(); 
    AnnotatedType<X> wrapped = new AnnotatedType<X>() { 
    @Override 
    public <T extends Annotation> T getAnnotation(final Class<T> annotation) { 
    if (javax.ws.rs.Path.class.equals(annotation)) { 
     class PathLiteral extends AnnotationLiteral<javax.ws.rs.Path> implements javax.ws.rs.Path { 
     @Override 
     public String value() { 
      return "change_me/" + (javax.ws.rs.Path) org.getAnnotation(annotation); 
     } 
     } 
     return (T) new PathLiteral(); 
    } else { 
     return org.getAnnotation(annotation); 
    } 
    } 
    pat.setAnnotatedType(wrapped); 
} 

...然後引導後,建設使用javax.enterprise.inject.spi.BeanManager豆期待下面的代碼打印 「change_me/......」

Set<Bean<?>> beans = beanManager.getBeans(jaxrsClass); 
for (Bean<?> bean : beans) { 
    CreationalContext cc = bm.createCreationalContext(bean); 
    Object jaxrs = bean.create(cc); 
    Path p = jaxrs.getClass().getAnnotation(Path.class); 
    System.out.println(p.value()); 
} 

...但是這是行不通的。對於JAX-RS資源'jaxrsClass',javax.ws.rs.Path不變。

出了什麼問題?

回答

0

我懷疑這可以通過可靠的方式完成。它可能都歸結爲首先發生的事情:CDI引導程序或JAX-RS,當然在將來或在其他應用程序服務器中,它們都可以並行完成。

雖然這當然是一個很酷的主意。他們在RestEasy論壇上說了些什麼?

+0

我想我幾乎在那裏,已經設法使用這種方法部署jaxrs端點。但是,是的,即時通訊不知道我是否在這裏攻擊jaxrs bootstrap。我在resteasy用戶郵件列表上發佈了一個問題。 – deephacks

0

我們已經在使用這種方法。

我們使用該功能來使用子資源定位器,並採取guice的力量。

在啓動時,我們正在掃描用@Path註釋的所有資源的類路徑。之後,我們將通過Names/@ Named提取路徑並綁定資源。所以資源可以在以後的名字的幫助下注入。

bind(..).annotatedWith(Names.named("path")).to(..) 

下一步是你需要一個帶有子資源定位器的資源。

@Path("{name}") 
public Object find(@PathParam("name") name){ 
    return injector.getInstance(..); 
} 

您可以使用此方法在運行時綁定它們,也可以更改原始註釋路徑。

+0

非常有趣!我不熟悉Guice的術語。這是否對JAX-RS資源提出了非標準要求?你有沒有JAX-RS資源的簡要例子? – deephacks

+0

您不必更改資源。我將創建一個小項目並將其發佈到此處,以便您看看它是如何工作的。 –

+0

不錯,那太棒了! – deephacks