ambiguous binding of parameter(s) retryAnnotation across '||' in pointcut
#2 230 ouverte le 28 oct. 2024
Description
Resilience4j version: 2.2.0
Java version: kotlin 1.9.25 with jvm 21
we are using aspectj with post compile weaving mode so basically we have sth like this in our build.gradle
plugins {
alias(libs.plugins.aspectj)
}
dependencies {
// ...
implementation(libs.springCore)
implementation(libs.springBeans)
implementation(libs.springContext)
implementation(libs.resilience4jRetry) // it seems already included in resilience4jSpring, so may not be necessary but anyway
implementation(libs.resilience4jSpring)
aspect(libs.resilience4jSpring)
// ...
}
so i see the RetryAspect is define in the io.github.resilience4j:resilience4j-spring module and tried adding it the aspect path to weave our project code but the compiler fails with the logs below
Since it even fails with no usage of @Retry annotation at all, i guess the problem lies in the definition of the pointcut in RetryAspect
Or maybe it's a kotlin issue? But as we are using pcw, the aspect is supposed to be woven into the same java bytecode which shouldn't matter whether it is originated from java source or kotlin source
Thanks in advance!
---- Compiler Messages ---
error at io/github/resilience4j/bulkhead/configure/BulkheadAspect.java::0 ambiguous binding of parameter(s) bulkheadAnnotation across '||' in pointcut
error at io/github/resilience4j/retry/configure/RetryAspect.java::0 ambiguous binding of parameter(s) retryAnnotation across '||' in pointcut
error at io/github/resilience4j/timelimiter/configure/TimeLimiterAspect.java::0 ambiguous binding of parameter(s) timeLimiterAnnotation across '||' in pointcut
error at io/github/resilience4j/ratelimiter/configure/RateLimiterAspect.java::0 ambiguous binding of parameter(s) rateLimiterAnnotation across '||' in pointcut
error at io/github/resilience4j/circuitbreaker/configure/CircuitBreakerAspect.java::0 ambiguous binding of parameter(s) circuitBreakerAnnotation across '||' in pointcut
abort trouble in:
public class AopTestService extends java.lang.Object:
public void <init>():
ALOAD_0 // LAopTestService; this (line 4)
INVOKESPECIAL java.lang.Object.<init> ()V
constructor-execution(void AopTestService.<init>())
| RETURN (line 5)
constructor-execution(void AopTestService.<init>())
end public void <init>()
public String publicMethod1():
method-execution(java.lang.String AopTestService.publicMethod1())
| LDC "Executing publicMethod1" (line 9)
| field-get(java.io.PrintStream java.lang.System.out)
| | GETSTATIC java.lang.System.out Ljava/io/PrintStream;
| field-get(java.io.PrintStream java.lang.System.out)
| SWAP
| method-call(void java.io.PrintStream.println(java.lang.Object))
| | INVOKEVIRTUAL java.io.PrintStream.println (Ljava/lang/Object;)V
| method-call(void java.io.PrintStream.println(java.lang.Object))
| NEW java.lang.RuntimeException (line 10)
| DUP
| LDC "Simulating failure in publicMethod1"
| constructor-call(void java.lang.RuntimeException.<init>(java.lang.String))
| | INVOKESPECIAL java.lang.RuntimeException.<init> (Ljava/lang/String;)V
| constructor-call(void java.lang.RuntimeException.<init>(java.lang.String))
| ATHROW
method-execution(java.lang.String AopTestService.publicMethod1())
end public String publicMethod1()
public String publicMethod2():
method-execution(java.lang.String AopTestService.publicMethod2())
| LDC "Executing publicMethod2" (line 15)
| field-get(java.io.PrintStream java.lang.System.out)
| | GETSTATIC java.lang.System.out Ljava/io/PrintStream;
| field-get(java.io.PrintStream java.lang.System.out)
| SWAP
| method-call(void java.io.PrintStream.println(java.lang.Object))
| | INVOKEVIRTUAL java.io.PrintStream.println (Ljava/lang/Object;)V
| method-call(void java.io.PrintStream.println(java.lang.Object))
| ALOAD_0 // LAopTestService; this (line 16)
| method-call(java.lang.String AopTestService.privateMethod())
| | INVOKESPECIAL AopTestService.privateMethod ()Ljava/lang/String;
| method-call(java.lang.String AopTestService.privateMethod())
| POP
| LDC "This should not be reached" (line 17)
| ARETURN
method-execution(java.lang.String AopTestService.publicMethod2())
end public String publicMethod2()
private String privateMethod():
method-execution(java.lang.String AopTestService.privateMethod())
| LDC "Executing privateMethod" (line 22)
| field-get(java.io.PrintStream java.lang.System.out)
| | GETSTATIC java.lang.System.out Ljava/io/PrintStream;
| field-get(java.io.PrintStream java.lang.System.out)
| SWAP
| method-call(void java.io.PrintStream.println(java.lang.Object))
| | INVOKEVIRTUAL java.io.PrintStream.println (Ljava/lang/Object;)V
| method-call(void java.io.PrintStream.println(java.lang.Object))
| NEW java.lang.RuntimeException (line 23)
| DUP
| LDC "Simulating failure in privateMethod"
| constructor-call(void java.lang.RuntimeException.<init>(java.lang.String))
| | INVOKESPECIAL java.lang.RuntimeException.<init> (Ljava/lang/String;)V
| constructor-call(void java.lang.RuntimeException.<init>(java.lang.String))
| ATHROW
method-execution(java.lang.String AopTestService.privateMethod())
end private String privateMethod()
public String fallback(Throwable):
method-execution(java.lang.String AopTestService.fallback(java.lang.Throwable))
| ALOAD_1 // Ljava/lang/Throwable; throwable
| LDC "throwable"
| method-call(void kotlin.jvm.internal.Intrinsics.checkNotNullParameter(java.lang.Object, java.lang.String))
| | INVOKESTATIC kotlin.jvm.internal.Intrinsics.checkNotNullParameter (Ljava/lang/Object;Ljava/lang/String;)V
| method-call(void kotlin.jvm.internal.Intrinsics.checkNotNullParameter(java.lang.Object, java.lang.String))
| ALOAD_1 // Ljava/lang/Throwable; throwable (line 28)
| method-call(java.lang.String java.lang.Throwable.getMessage())
| | INVOKEVIRTUAL java.lang.Throwable.getMessage ()Ljava/lang/String;
| method-call(java.lang.String java.lang.Throwable.getMessage())
| INVOKEDYNAMIC #0.makeConcatWithConstants (Ljava/lang/String;)Ljava/lang/String;
| field-get(java.io.PrintStream java.lang.System.out)
| | GETSTATIC java.lang.System.out Ljava/io/PrintStream;
| field-get(java.io.PrintStream java.lang.System.out)
| SWAP
| method-call(void java.io.PrintStream.println(java.lang.Object))
| | INVOKEVIRTUAL java.io.PrintStream.println (Ljava/lang/Object;)V
| method-call(void java.io.PrintStream.println(java.lang.Object))
| LDC "Fallback result" (line 29)
| ARETURN
method-execution(java.lang.String AopTestService.fallback(java.lang.Throwable))
end public String fallback(Throwable)
end public class AopTestService
-- (BCException) Impossible! annotation=[io.github.resilience4j.retry.annotation.Retry] shadow=[method-execution(java.lang.String AopTestService.publicMethod1()) at /AopTestService.kt:9::0] pointcut is at [io/github/resilience4j/retry/configure/RetryAspect.java::0]
when implementing on shadow method-execution(java.lang.String AopTestService.publicMethod1())
when weaving type AopTestService
when weaving classes
when weaving
when batch building BuildConfig[null] #Files=0 AopXmls=#0
Impossible! annotation=[io.github.resilience4j.retry.annotation.Retry] shadow=[method-execution(java.lang.String AopTestService.publicMethod1()) at /AopTestService.kt:9::0] pointcut is at [io/github/resilience4j/retry/configure/RetryAspect.java::0]
when implementing on shadow method-execution(java.lang.String AopTestService.publicMethod1())
when weaving type AopTestService
when weaving classes
when weaving
when batch building BuildConfig[null] #Files=0 AopXmls=#0
org.aspectj.weaver.BCException: Impossible! annotation=[io.github.resilience4j.retry.annotation.Retry] shadow=[method-execution(java.lang.String AopTestService.publicMethod1()) at /AopTestService.kt:9::0] pointcut is at [io/github/resilience4j/retry/configure/RetryAspect.java::0]
when implementing on shadow method-execution(java.lang.String AopTestService.publicMethod1())
when weaving type AopTestService
when weaving classes
when weaving
when batch building BuildConfig[null] #Files=0 AopXmls=#0
at org.aspectj.weaver.patterns.WithinAnnotationPointcut.findResidueInternal(WithinAnnotationPointcut.java:156)
at org.aspectj.weaver.patterns.Pointcut.findResidue(Pointcut.java:260)
at org.aspectj.weaver.patterns.AndPointcut.findResidueInternal(AndPointcut.java:101)
at org.aspectj.weaver.patterns.Pointcut.findResidue(Pointcut.java:260)
at org.aspectj.weaver.patterns.OrPointcut.findResidueInternal(OrPointcut.java:111)
at org.aspectj.weaver.patterns.Pointcut.findResidue(Pointcut.java:260)
at org.aspectj.weaver.bcel.BcelAdvice.specializeOn(BcelAdvice.java:194)
at org.aspectj.weaver.bcel.BcelShadow.prepareForMungers(BcelShadow.java:358)
at org.aspectj.weaver.Shadow.implement(Shadow.java:548)
at org.aspectj.weaver.bcel.BcelClassWeaver.implement(BcelClassWeaver.java:3367)
at org.aspectj.weaver.bcel.BcelClassWeaver.weave(BcelClassWeaver.java:499)
at org.aspectj.weaver.bcel.BcelClassWeaver.weave(BcelClassWeaver.java:103)
at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:1703)
at org.aspectj.weaver.bcel.BcelWeaver.weaveWithoutDump(BcelWeaver.java:1647)
at org.aspectj.weaver.bcel.BcelWeaver.weaveAndNotify(BcelWeaver.java:1414)
at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:1189)
at org.aspectj.ajdt.internal.compiler.AjPipeliningCompilerAdapter.weaveQueuedEntries(AjPipeliningCompilerAdapter.java:510)
at org.aspectj.ajdt.internal.compiler.AjPipeliningCompilerAdapter.afterCompiling(AjPipeliningCompilerAdapter.java:374)
at org.aspectj.ajdt.internal.compiler.CompilerAdapter.ajc$afterReturning$org_aspectj_ajdt_internal_compiler_CompilerAdapter$2$b918bbbe(CompilerAdapter.aj:79)
at org.aspectj.org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:427)
at org.aspectj.ajdt.internal.core.builder.AjBuildManager.performCompilation(AjBuildManager.java:1101)
at org.aspectj.ajdt.internal.core.builder.AjBuildManager.performBuild(AjBuildManager.java:275)
at org.aspectj.ajdt.internal.core.builder.AjBuildManager.batchBuild(AjBuildManager.java:188)
at org.aspectj.ajdt.ajc.AjdtCommand.doCommand(AjdtCommand.java:103)
at org.aspectj.ajdt.ajc.AjdtCommand.runCommand(AjdtCommand.java:47)
at org.aspectj.tools.ajc.Main.run(Main.java:385)
at org.aspectj.tools.ajc.Main.runMain(Main.java:274)
at org.aspectj.tools.ajc.Main.main(Main.java:92)