Как вызвать ошибку компиляции с несоответствием точки аспектаJ

У меня есть следующий аспект:

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

Как видите, этот pointcut соответствует только методам, аннотированным com.xxx.annotations.MyCustomAnnotation, которые имеют 2 аргумента — первый произвольный, а второй должен быть типа Map<String, Object>.

Есть ли способ настроить аспект j-maven-plugin для принудительной компиляции ошибок, если он находит методы, аннотированные с помощью com.xxx.annotations.MyCustomAnnotation, но не соответствующие подписи * *(*,Map<String, Object>)?

Или другими словами:

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

-> Я хочу, чтобы это вызывало ошибку времени компиляции, потому что Map<String, String> != Map<String, Object>


person mdzh    schedule 17.01.2017    source источник


Ответы (1)


Вы делаете это непосредственно в аспекте, нет необходимости настраивать его в плагине AspectJ Maven. Вот небольшой образец:

Аннотация маркера:

package de.scrum_master.app;

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

@Retention(RetentionPolicy.RUNTIME)
public @interface MyCustomAnnotation {}

Пример класса приложения:

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) {}
}

Аспект объявляет об ошибке компиляции при несоответствии сигнатуры метода:

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";
}

При компиляции этого кода вы увидите следующую ошибку в Eclipse в виде аннотации кода и в представлении задачи (консоль Maven покажет ту же ошибку при выполнении цели compile AspectJ Maven):

Маркер ошибки редактора Eclipse

Просмотр задачи Eclipse

person kriegaex    schedule 17.01.2017
comment
P.S.: Для мелких проблем, если вы хотите предупредить людей вместо сбоя сборки, вы также можете использовать @DeclareWarning. - person kriegaex; 18.01.2017