【问题标题】:Annotation not found on object with Runtime retention在具有运行时保留的对象上找不到注释
【发布时间】:2012-01-19 09:43:09
【问题描述】:

好的,我在这里有点困惑。我正在尝试通过在模型上使用注释来选择“DAO”类:

@Entity
@Table(name="dispatcher")
// use the Kamailio Base DAO for code that supports this annotation
@DAOSelector(dao = DAOBaseKamailio.class) 
public class DispatcherSet extends Model {
    [...]
}

这里是注解定义:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DAOSelector {
       Class<?> dao();
}

我使用以下代码返回正确的“DAO”类:

public static DAOInterface getCorrectDAO(final Object object) throws Exception {
  final DAOSelector annotation = 
    object.getClass().getAnnotation(DAOSelector.class);

  if(annotation != null) {
    System.out.println("Annotation present: " + 
      annotation.dao().getName() + " for class " + object.getClass().getName());

    final Object dao = annotation.dao().newInstance();
    if(!(dao instanceof DAOInterface)) {
      throw new Exception("Invalid Base DAO in annotation for entity " + 
        object.getClass().getName());
    }
    return (DAOInterface) dao;
  }
  else {
    System.out.println("Annotation not present for class " + 
      object.getClass().getName());
    return new DAOBase();
  }
}

但是,当我输入 DispatcherSet 对象时,注解始终为空:

10:33:38,498 [INFO] [STDOUT] 类 model.DispatcherSet 的注释不存在

我错过了什么吗?

编辑:

好的,发现了一些有趣的东西,我在 JBoss 容器中运行这段代码,当我打印出所有注释时:

{{{
$Proxy76
$Proxy708
$Proxy77
}}}

我猜其中一个应该是DAOSelector 注释的代理实例,所以这可能是getAnnotation(DAOSelector.class) 不起作用的原因,请检查一下。

编辑2:

不,它们不是DAOSelector 的实例

【问题讨论】:

    标签: java reflection annotations


    【解决方案1】:

    我已经解决了这个问题。这是一个类路径问题。我有一只耳朵,里面装着罐子和战争。模型在 jar 中,注释在两者中都有。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-09
      相关资源
      最近更新 更多