【问题标题】:Modifying class annotations using CDI使用 CDI 修改类注释
【发布时间】:2012-11-19 21:58:29
【问题描述】:

尝试使用 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());
}

...但这不起作用。对于 JAX-RS 资源 'jaxrsClass',javax.ws.rs.Path 保持不变。

怎么了?

【问题讨论】:

    标签: cdi weld


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-22
      • 2013-07-08
      • 1970-01-01
      • 2012-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多