【问题标题】:Custom Annotation processor not being invoked by tomcattomcat 未调用自定义注释处理器
【发布时间】:2017-05-16 06:38:58
【问题描述】:

tomcat 未调用自定义注释处理器。以下是我正在使用的注释处理器代码:

@SuppressWarnings("restriction")
@SupportedAnnotationTypes("io.strati.rs.cxf2.bindings.MyAnnotation")
@SupportedSourceVersion( SourceVersion.RELEASE_8 )
public class SimpleAnnotationProcessor extends AbstractProcessor {

    public static List<String> str = new ArrayList<>();

    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {

        System.out.println("Into annotation processor ... 2");

        for ( Element element : roundEnv.getElementsAnnotatedWith(MyAnnotation.class)) {
            System.out.println("Method name is:"+element.getSimpleName());
            str.add(element.getSimpleName().toString());
        }   
        return false;
    }
}

这存储了所有具有自定义注解的方法的方法名称。这就是注解类的样子:

@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(value = RetentionPolicy.RUNTIME)
public @interface MyAnnotation {

}

我正在尝试访问 tomcat 应用程序中的列表,如下所示:

@GET
@Path("/dummy")
@MyAnnotation
@Produces({APPLICATION_JSON, APPLICATION_XML, TEXT_XML})
public void print(){
   System.out.println("List is:"+SimpleAnnotationProcessor.str);
}

即使方法有注释,列表也会打印为空。我已经在 maven 编译器插件中指定了注释,并在 META-INF/services/javax.annotation.processing.Processor 中指定了它。谁能告诉我注释处理器没有被调用的可能原因是什么?

【问题讨论】:

    标签: java tomcat annotations annotation-processing annotation-processor


    【解决方案1】:

    我怀疑 Tomcat 与它有什么关系。注释处理发生在编译时,通常用于生成或修改代码。注释处理器可以看作是一个编译器插件。

    https://www.javacodegeeks.com/2015/09/java-annotation-processors.html

    根据保留政策,Java 编译器将在编译阶段将注解保留在类文件中,但它不会(也不应该)在运行时可用。

    很可能注解处理器实际上是在将 print() 方法名称添加到列表中(检查构建输出),但这仅在编译代码时才会发生。

    在运行时部署的 Web 服务永远不会在编译时看到处理器填充的列表,它们是完全不同的环境。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-24
      • 1970-01-01
      相关资源
      最近更新 更多