我試圖使用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
不變。
出了什麼問題?
我想我幾乎在那裏,已經設法使用這種方法部署jaxrs端點。但是,是的,即時通訊不知道我是否在這裏攻擊jaxrs bootstrap。我在resteasy用戶郵件列表上發佈了一個問題。 – deephacks