resilience4j icon indicating copy to clipboard operation
resilience4j copied to clipboard

ambiguous binding of parameter(s) retryAnnotation across '||' in pointcut

Open jiyolla opened this issue 1 year ago • 1 comments

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)

jiyolla avatar Oct 28 '24 03:10 jiyolla