尝试使用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);
}
...然后在bootstrap之后,使用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());
}
......但这不起作用。 JAX-RS资源'jaxrsClass'的javax.ws.rs.Path
未更改。
有什么问题?
答案 0 :(得分:0)
AnnotatedType
是CDI和实际Java类注释之间的抽象层。 CDI仅考虑AnnotatedType
元数据,但不考虑原始注释。
在observer方法中修改AnnotatedType
不会更改底层Java类的原始注释。