3

自定义注释处理器未被tomcat调用。以下是我正在使用的注释处理器代码:自定义注释处理器未被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中指定了它。有人能告诉我什么是可能的原因,因为注释处理器没有被调用?

回答

1

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

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

继保留策略,注释将要通过Java编译器在类文件在编译阶段但它不会(也不应该是)在运行时可用保留。

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

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