【发布时间】:2023-03-15 21:20:01
【问题描述】:
我正在尝试使用 CDI 扩展在运行时发现 JAX-RS 资源,并在 Java SE 环境中自动将它们发布到不同的基本 URI 下。如果可能,应用程序不需要自行扩展javax.ws.rs.core.Application。
我已阅读 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 构造bean 期望以下代码打印“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' 保持不变。
怎么了?
【问题讨论】: