Итак, в основном моя ситуация такова:
У меня довольно большой проект на работе, и я должен создать его с помощью ant. Мы используем Lombok, поэтому я не могу просто скомпилировать его с помощью ajc (как я выяснил, ajc не может использовать обработку аннотаций, поэтому мне нужно сначала скомпилировать его с Java, а затем сплетить с аспектами в форме двоичного файла .class).
В Intellij код компилируется просто отлично, но когда я запускаю ant build, я сталкиваюсь с ошибкой pjp: [aspectj:iajc] [error 3]: error at C:\DBO-Server\java\DBO-Server\jk-out!by\bps\sbolbusiness\loggers\pointcut\BaseServiceLogger.class::0 use of ProceedingJoinPoint is allowed only on around advice (arg 1 in (before(extraFlags: 2): (@annotation(by.bps.sbolbusiness.loggers.annotations.EnableAudit) && persingleton(by.bps.sbolbusiness.loggers.pointcut.BaseServiceLogger))->void by.bps.sbolbusiness.loggers.pointcut.BaseServiceLogger.watchBefore(org.aspectj.lang.JoinPoint, by.bps.sbolbusiness.loggers.annotations.EnableAudit)))
Итак, насколько я понимаю, моя проблема
ProceedingJoinPoint разрешен только на ближайших советах
в
watchBefore (org.aspectj.lang.JoinPoint, by.bps.sbolbusiness.loggers.annotations.EnableAudit))
Суть в том, что, как вы видите, в этом методе нет ProceedingJoinPoint ! Только просто JoinPoint
@Aspect
@Slf4j
public class BaseServiceLogger {
....
@Pointcut("@annotation(by.bps.sbolbusiness.loggers.annotations.EnableAudit)&&@annotation(marker)")
public void logService(EnableAudit marker) {}
@Before(value = "logService(marker)", argNames = "jp,marker")
public void watchBefore(JoinPoint jp, EnableAudit marker) {
startMessage(jp, marker);
}
....
}
Вот мой build.xml
<?xml version="1.0"?>
<project xmlns:aspectj="antlib:org.aspectj" name="SBOL-Business" default="build">
<property name="src" location="jk-src"/>
<property name="out" location="jk-out"/>
<property name="a-out" location="jk-a"/>
<property name="libs" location="..\..\Shared\lib"/>
<property name="webLibs" location="C:\Program Files\Apache Tomcat\current\lib"/>
<property name="daoSrc" location="..\..\Shared\Dao"/>
<property name="constantsSrc" location="..\..\Shared\Constants"/>
<property environment="env"/>
<target name="assemble">
<mkdir dir="${src}"/>
<copy todir="${src}">
<fileset dir="src"/>
</copy>
<copy todir="${src}">
<fileset dir="${daoSrc}"/>
</copy>
<copy todir="${src}">
<fileset dir="${constantsSrc}"/>
</copy>
</target>
<target name="compile.javac" depends="assemble">
<mkdir dir="${out}"/>
<javac srcdir="${src}" destdir="${out}" includeantruntime="false" encoding="UTF-8" debug="true">
<classpath>
<fileset dir="${libs}">
<include name="**/*.jar"/>
</fileset>
<fileset dir="${webLibs}">
<include name="**/*.jar"/>
</fileset>
</classpath>
</javac>
</target>
<target name="compile.aspectj" depends="compile.javac">
<mkdir dir="${a-out}"/>
<aspectj:iajc source="1.8" destDir="jk-a" XnoInline="false">
<inpath>
<pathelement location="${out}" />
</inpath>
<classpath>
<fileset dir="${libs}">
<include name="**/*.jar" />
</fileset>
<fileset dir="${webLibs}">
<include name="**/*.jar" />
</fileset>
</classpath>
</aspectj:iajc>
</target>
<target name="clean" depends="compile.aspectj">
<delete dir="${src}"/>
<delete dir="${out}"/>
<delete dir="${a-out}"/>
</target>
<target name="build" depends="clean"/>
Здесь аннотировано @ EnableAudit пример:
@EnableAudit(additionaInfo = true, serviceName = "Request AccountsQueryRq")
public GetOrgUserAccountsOverviewRs process(String loginName, Long customerId) {
//Method code
}
А вот аспект .java класса:
package by.bps.sbolbusiness.loggers.pointcut;
import by.bps.sbolbusiness.loggers.annotations.EnableAudit;
import by.bps.sbolbusiness.loggers.utils.LogLevel;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.util.StopWatch;
@Aspect
@Slf4j
public class BaseServiceLogger {
private StopWatch sw;
//Some variables
@Pointcut("@annotation(by.bps.sbolbusiness.loggers.annotations.EnableAudit)&&@annotation(marker)")
public void logService(EnableAudit marker) {}
@Before(value = "logService(marker)", argNames = "jp,marker")
public void watchBefore(JoinPoint jp, EnableAudit marker) {
startMessage(jp, marker);
}
@AfterReturning(value = "logService(marker)", argNames = "marker")
public void watchAfter(EnableAudit marker) {
finishMessage(marker);
}
@AfterThrowing(value = "logService(marker)", argNames = "marker")
public void watchAfterException(EnableAudit marker) {
throwingMessage(marker);
}
private void startMessage(JoinPoint jp, EnableAudit marker) {
//Long code
}
private void finishMessage(EnableAudit marker) {
//More long code here
}
private void throwingMessage(EnableAudit marker) {
//And more code
}
private void details(JoinPoint jp, StringBuilder sb) {
//Some other code here
}
}
Учитывая, что код компилируется и работает с IDE просто отлично, я предполагаю, что что-то не так с моим скриптом сборки. Может кто-нибудь, пожалуйста, помогите мне с этим? Может быть, есть какой-то параметр, который мне нужно передать в iajc или что-то еще? В этот момент я попробовал все, что мог, но безуспешно
Edit:
журнал вывода ant:
Buildfile: C:\DBO-Server\java\DBO-Server\build.xml
assemble:
[copy] Copying 1 file to C:\DBO-Server\java\DBO-Server\jk-src
compile.javac:
[javac] Compiling 4 source files to C:\DBO-Server\java\DBO-Server\jk-out
compile.aspectj:
[aspectj:iajc] MessageHolder: (2908 info) (96 error)
[aspectj:iajc] [error 0]: error at by\bps\sbolbusiness\loggers\pointcut\BaseServiceLogger.java::0 the parameter marker is not bound in [all branches of] pointcut
[aspectj:iajc] [error 1]: error at by\bps\sbolbusiness\loggers\pointcut\BaseServiceLogger.java::0 the parameter marker is not bound in [all branches of] pointcut
[aspectj:iajc] [error 2]: error at by\bps\sbolbusiness\loggers\pointcut\BaseServiceLogger.java::0 the parameter marker is not bound in [all branches of] pointcut
[aspectj:iajc] [error 3]: error at C:\DBO-Server\java\DBO-Server\jk-out!by\bps\sbolbusiness\loggers\pointcut\BaseServiceLogger.class::0 use of ProceedingJoinPoint is allowed only on around advice (arg 1 in (before(extraFlags: 2): (@annotation(by.bps.sbolbusiness.loggers.annotations.EnableAudit) && persingleton(by.bps.sbolbusiness.loggers.pointcut.BaseServiceLogger))->void by.bps.sbolbusiness.loggers.pointcut.BaseServiceLogger.watchBefore(org.aspectj.lang.JoinPoint, by.bps.sbolbusiness.loggers.annotations.EnableAudit)))
[aspectj:iajc] [error 4]: error at C:\DBO-Server\java\DBO-Server\jk-out!by\bps\sbolbusiness\loggers\pointcut\BaseServiceLogger.class::0 use of ProceedingJoinPoint is allowed only on around advice (arg 0 in (afterReturning: (@annotation(by.bps.sbolbusiness.loggers.annotations.EnableAudit) && persingleton(by.bps.sbolbusiness.loggers.pointcut.BaseServiceLogger))->void by.bps.sbolbusiness.loggers.pointcut.BaseServiceLogger.watchAfter(by.bps.sbolbusiness.loggers.annotations.EnableAudit)))
... about 70+ identical lines ...
[aspectj:iajc] [error 94]: error at C:\DBO-Server\java\DBO-Server\jk-out!by\bps\sbolbusiness\loggers\pointcut\BaseServiceLogger.class::0 use of ProceedingJoinPoint is allowed only on around advice (arg 0 in (afterReturning: (@annotation(by.bps.sbolbusiness.loggers.annotations.EnableAudit) && persingleton(by.bps.sbolbusiness.loggers.pointcut.BaseServiceLogger))->void by.bps.sbolbusiness.loggers.pointcut.BaseServiceLogger.watchAfter(by.bps.sbolbusiness.loggers.annotations.EnableAudit)))
[aspectj:iajc] [error 95]: error at C:\DBO-Server\java\DBO-Server\jk-out!by\bps\sbolbusiness\loggers\pointcut\BaseServiceLogger.class::0 use of ProceedingJoinPoint is allowed only on around advice (arg 0 in (afterThrowing: (@annotation(by.bps.sbolbusiness.loggers.annotations.EnableAudit) && persingleton(by.bps.sbolbusiness.loggers.pointcut.BaseServiceLogger))->void by.bps.sbolbusiness.loggers.pointcut.BaseServiceLogger.watchAfterException(by.bps.sbolbusiness.loggers.annotations.EnableAudit)))