如何使用aspectJ切入点不匹配强制编译错误

mdz*_*dzh 2 java aspectj maven aspectj-maven-plugin

我有以下aspectJ切入点:

@Around(value="execution(* *(*,Map<String, Object>)) && @annotation(com.xxx.annotations.MyCustomAnnotation)")
Run Code Online (Sandbox Code Playgroud)

如您所见,此切入点仅匹配使用 com.xxx.annotations.MyCustomAnnotation 注释的方法,该方法有 2 个参数 - 第一个是任意的,第二个必须是类型Map<String, Object>。

如果找到使用 com.xxx.annotations.MyCustomAnnotation 注释但与签名不匹配的方法,是否可以配置 aspectj-maven-plugin 以强制编译错误* *(*,Map<String, Object>)?

或者换句话说,:

@com.xxx.annotations.MyCustomAnnotation
public void test(String s, Map<String, String> m) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

-> 我希望这会产生编译时错误,因为Map<String, String>!=Map<String, Object>

kri*_*aex 5

您可以直接在一个方面内完成,无需在 AspectJ Maven 插件中进行配置。这是一个小示例:

标记注释:

package de.scrum_master.app;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface MyCustomAnnotation {}
Run Code Online (Sandbox Code Playgroud)

示例应用程序类:

package de.scrum_master.app;

import java.util.Map;

public class Application {
    public void notAnnotated(String s, Map<String, Object> m) {}

    @MyCustomAnnotation
    public void correctSignature(String s, Map<String, Object> m) {}

    @MyCustomAnnotation
    public void wrongSignature(String s, Map<String, String> m) {}
}
Run Code Online (Sandbox Code Playgroud)

在方法签名不匹配时声明编译错误的方面:

package de.scrum_master.aspect;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.DeclareError;

@Aspect
public class PointcutChecker {
    @DeclareError(
        "execution(* *(..)) && " +
        "@annotation(de.scrum_master.app.MyCustomAnnotation) && " +
        "!execution(* *(*, java.util.Map<String, Object>))"
    )
    static final String wrongSignatureError =
        "wrong method signature for @MyCustomAnnotation";
}
Run Code Online (Sandbox Code Playgroud)

编译此代码时,您将在 Eclipse 中看到以下错误作为代码注释和问题视图(在执行 AspectJ Maven 的compile目标时,Maven 控制台将显示相同的错误):

Eclipse 编辑器错误标记

Eclipse 问题视图