CDI 拡張機能を使用して、実行時に JAX-RS リソースを検出し、それらを Java SE 環境のさまざまなベース URI で自動的に公開しようとしています。javax.ws.rs.core.Application
可能であれば、アプリケーション自体を拡張する必要はありません。
RestEasy のドキュメントと javadoc を読みましたが@ApplicationPath
、実行時に変更する明白な方法を見つけることができませんでした。
私が模索している 1 つのアイデアは、おそらく AnnotatedType CDI 拡張機能を使用して、ベース URI をプログラムで生成javax.ws.rs.core.Application
および設定し、それを org.jboss.resteasy.spi.ResteasyDeployment` として公開することです。@ApplicationPath
これを行う他の/より良い方法はありますか?
編集:
CDI 拡張イベントを試行して、JAX-RS リソースProcessAnnotatedType
を変更します。@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);
}
...その後、ブートストラップの後、使用してBeanを構築すると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());
}
...しかし、これは機能しません。javax.ws.rs.Path
JAX-RS リソース 'jaxrsClass' については変更されていません。
なにが問題ですか?