春季自定义注释处理器

时间:2013-03-29 16:01:08

标签: spring annotations maven-3

我写了这个注释

    @Retention(RetentionPolicy.SOURCE)
public @interface Encrypt {

}

及其处理器......

@SupportedAnnotationTypes("it.trecube.annotation.Encrypt")
@SupportedSourceVersion(SourceVersion.RELEASE_7)
public class EncryptProcessor extends AbstractProcessor{

    public EncryptProcessor(){
        super();
    }


    @Override
    public boolean process(Set<? extends TypeElement> annotations,
            RoundEnvironment roundEnv) {
        String className = null;
        String packageName = null;
        String fqClassName = null;
        for (Element elem : roundEnv.getElementsAnnotatedWith(Encrypt.class)) {
            if (elem.getKind() == ElementKind.CLASS) {
                //              Encrypt encrypt = elem.getAnnotation(Encrypt.class);
                //              String message = "annotation found in " + elem.getSimpleName();
                //              processingEnv.getMessager().printMessage(Kind.NOTE, message);
                TypeElement classElement = (TypeElement) elem;
                PackageElement packageElement = (PackageElement) classElement.getEnclosingElement();

                processingEnv.getMessager().printMessage(
                        Diagnostic.Kind.NOTE,
                        "annotated class: @Encrypt" , elem);

                className = classElement.getSimpleName().toString();
                packageName = packageElement.getQualifiedName().toString();
                fqClassName = classElement.getQualifiedName().toString();

                if (fqClassName != null) {
                    processingEnv.getMessager().printMessage(
                            Diagnostic.Kind.NOTE,
                            "fqClassName: "+fqClassName , elem);
                    Properties props = new Properties();
                    URL url = this.getClass().getClassLoader().getResource("velocity.properties");
                    try {
                        props.load(url.openStream());
                    } catch (IOException e) {
                        processingEnv.getMessager().printMessage(
                                Diagnostic.Kind.ERROR,
                                "annotated class: " + classElement.getQualifiedName()+"->\n"+
                                        e.getMessage(), elem);
                        e.printStackTrace();
                        return true;
                    }
                    VelocityEngine ve = new VelocityEngine(props);
                    ve.init();

                    VelocityContext vc = new VelocityContext();

                    vc.put("className", className);
                    vc.put("packageName", packageName);


                    Template vt = ve.getTemplate("encrypt.vm");
                    File file = new File("src/main/java/"+fqClassName.replace(".", "/")+"_Encrypt.aj");
                    try {
                    BufferedWriter bw = new BufferedWriter(new FileWriter(file));

                        processingEnv.getMessager().printMessage(
                                Diagnostic.Kind.NOTE,
                                "creating source file: " + file.getAbsolutePath());


                        processingEnv.getMessager().printMessage(
                                Diagnostic.Kind.NOTE,
                                "applying velocity template: " + vt.getName());

                        vt.merge(vc, bw);

                        bw.close();
                    } catch (IOException e) {
                        processingEnv.getMessager().printMessage(
                                Diagnostic.Kind.ERROR,
                                "applying velocity error: " + vt.getName()+"->\n"+e.getMessage());
                        e.printStackTrace();
                    }
                }
            }
        }
        return true; // no further processing of this annotation type
    }

我已经测试了所有maven客户端项目并且所有工作,但是当我尝试将它用于现有的spring(完整的maven构建)项目不起作用时...... 有人能帮我吗?? TNX

2 个答案:

答案 0 :(得分:2)

您是否在拥有注释处理器的项目中创建了META-INF/services/javax.annotation.processing.Processor文件?此文件应包含处理器的完全限定名称。此外,使用maven,您可以通过配置maven-compiler-plugin来指定要在构建中使用的注释处理器:

<plugin>
   <artifactId>maven-compiler-plugin</artifactId>
   <configuration>
        <annotationProcessors>
            <annotationProcessor>com.mycompany.MyAnnotationProcessor</annotationProcessor>
        </annotationProcessors>
    </configuration>
</plugin>

此外,在您使用它的同一个项目中使用注释处理器可能会导致maven出现一些问题,所以如果您还没有这样做,我建议您将注释处理器和注释提取到一个单独的maven项目。

答案 1 :(得分:1)

解决了这个......

            <plugin>
                <groupId>org.bsc.maven</groupId>
                <artifactId>maven-processor-plugin</artifactId>
                <executions>
                    <execution>
                        <id>process</id>
                        <goals>
                            <goal>process</goal>
                        </goals>
                        <phase>generate-sources</phase>
                    </execution>
                </executions>
            </plugin>