0

尝试使用 CDI 扩展事件ProcessAnnotatedType来更改@javax.ws.rs.PathJAX-RS 资源。

<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);
}

...然后在引导之后,使用构建 beanjavax.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' 保持不变。

怎么了?

4

1 回答 1

0

AnnotatedType是 CDI 和实际 Java 类注解之间的抽象层。CDI 只考虑AnnotatedType元数据,而不考虑原始注释。

修改AnnotatedType观察者方法中的 an 不会更改底层 Java 类上的原始注解。

于 2013-01-07T21:25:02.500 回答