New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unable to intercept methods with mixed enum types as varargs [SPR-13328] #17913

Closed
spring-issuemaster opened this Issue Aug 6, 2015 · 4 comments

Comments

Projects
None yet
2 participants
@spring-issuemaster
Copy link
Collaborator

spring-issuemaster commented Aug 6, 2015

Andy Clement opened SPR-13328 and commented

This was raised against AspectJ but I'm thinking (from the stack trace) it may be Spring AOP. The AJ bug is : https://bugs.eclipse.org/bugs/show_bug.cgi?id=474266

and the text from that is:

The method I used AspectJ+SpringAOP to intercept is declared as below:

public <V extends IMessage> void getMessageValue(V... messages)

And the arguments passed into this method are actually enums declared like below:

public enum CustomMessage implements IMessage {
    WELCOME("Hello"),
    GOODBYE("Bye");
    ...

}

The method call of getMessageValue() is like:

getMessageValue(CustomMessage.WELCOME, CustomMessage.GOODBYE);

And there will be an exception thrown:

java.lang.ClassCastException: [Ljava.lang.Enum; cannot be cast to [Lcom.read.maventest.interface.IMessage;
	at com.read.maventest.bean.TestEnumList$$FastClassBySpringCGLIB$$21d778f3.invoke(<generated>)
	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
	at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:52)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)
	at com.read.maventest.bean.TimingAspect.timeStats(TimingAspect.java:25)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)

Affects: 4.1.6

Issue Links:

  • #18270 Regression: Spring on WildFly causing ClassNotFoundException in ASM when deployed outside of EAR

Referenced from: commits 8c4b8d2, a8432bc

0 votes, 5 watchers

@spring-issuemaster

This comment has been minimized.

Copy link
Collaborator Author

spring-issuemaster commented Aug 6, 2015

hui gao commented

The Spring version I used in this issue is 4.1.6.RELEASE. The AspectJ version is 1.8.6.

@spring-issuemaster

This comment has been minimized.

Copy link
Collaborator Author

spring-issuemaster commented Sep 7, 2015

Juergen Hoeller commented

hui gao, I've tried several ways to reproduce this, and it always works for me. Please try to isolate a test case that actually fails for you and submit it here... ideally against 4.2.1.

Juergen

@spring-issuemaster

This comment has been minimized.

Copy link
Collaborator Author

spring-issuemaster commented Oct 16, 2015

hui gao commented

Sorry I forgot to mention that you have to define at least 2 child enums to pass into the method to reproduce this problem. For example:
public enum CustomMessage implements IMessage{
WELCOME("Hello"),
GOODBYE("Bye");
...
}
public enum CustomLabel implements IMessage {
LANGUAGE("Language");
...
}

The method call shall be like
getMessageValue(CustomMessage.WELCOME, CustomLabel.LANGUAGE);

@spring-issuemaster

This comment has been minimized.

Copy link
Collaborator Author

spring-issuemaster commented Oct 26, 2015

Juergen Hoeller commented

This turns out to be a fairly involved change, so I'm only fixing it for 4.2.3.

The Java compiler seems to turn the given vararg array into an Enum array in case of mixed enum arguments, not actually assignable to the target array declared with an interface type. We're explicitly detecting that case now, auto-converting the argument array if necessary.

Juergen

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment