有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java AspectJ&Maven警告:“未应用……中定义的建议?”

我正试图在编译时将某些方面编入一个项目,使之成为一场战争。方面建议在同一项目中的类(尽管在不同的包中)

我得到警告:

Advice not applied

我的相位没有被执行。以下是我的设置:

注释footannotation。爪哇:

package a;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface FooAnnotation {}

这是我的建议。aj:

package a;
public aspect FooAdvice {
    private static final Log log = LogFactory.getLog(FooAdvice.class);

    Object around() : call( @FooAnnotation * *(..)) {   
        log.info(String.format("Testing around"));
        return proceed();
    }
}

我还尝试了注释:

@Around("call( @FooAnnotation * *(..))")
public Object checkFoo( ProceedingJoinPoint joinPoint) throws Throwable {

据我所知,我的切入点规范是正确的,但由于某些原因,ajc编译器没有发挥作用

上课,上课。爪哇:

package b;
@ApplicationPath("/service")
@Path("/{param}")
@Produces("application/json")
@Provider
public class FooClass {

    @POST
    @PUT
    @Path("/{context}/{resource}")
    @FooAnnotation
    public String updateResource(...) {}

波姆。xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>zzz.group</groupId>
    <artifactId>yyy.artifact</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>yyy.name</name>

    <properties>
        <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <javaVersion>1.6</javaVersion>
        <org.aspectj-version>1.7.2</org.aspectj-version>
    </properties>

    <dependencies>
        <dependency>
            ... stuff ...
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>${org.aspectj-version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.0</version>
                <configuration>
                    <source>${javaVersion}</source>
                    <target>${javaVersion}</target>
                    <compilerArguments>
                        <endorseddirs>${endorsed.dir}</endorseddirs>
                    </compilerArguments>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.1.1</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>aspectj-maven-plugin</artifactId>
                <!--
                    Have to use version 1.2 since version 1.3 does not appear to work
                    with ITDs
                -->
                <version>1.4</version>
                <dependencies>
                    <!--
                        You must use Maven 2.0.9 or above or these are ignored (see
                        MNG-2972)
                    -->
                    <dependency>
                        <groupId>org.aspectj</groupId>
                        <artifactId>aspectjrt</artifactId>
                        <version>${org.aspectj-version}</version>
                    </dependency>
                    <dependency>
                        <groupId>org.aspectj</groupId>
                        <artifactId>aspectjtools</artifactId>
                        <version>${org.aspectj-version}</version>
                    </dependency>
                </dependencies>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <!-- <goal>test-compile</goal> -->
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <outxml>true</outxml>
                    <source>${javaVersion}</source>
                    <target>${javaVersion}</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

共 (1) 个答案

  1. # 1 楼答案

    啊哈!在这里找到了答案:

    aspectj: why advice cannot be applied?

    这与maven无关

    原因是在我的示例中,该方法是通过间接加载从jax-rs框架内调用的。call()建议想要编织调用者,但ajc编译器无法知道调用者在哪里。解决方法是将通知更改为execution(),从而:

    Object around() : execution(@FooAnnotation * *(..)) {...}
    

    这是不同的,因为它围绕着执行(ajc可以找到),而不是调用方

    完成了