Skip to content
This repository was archived by the owner on Feb 23, 2023. It is now read-only.

AOP do not support '*' on class field with execution pointcut designator #1580

Closed
Sochene opened this issue Apr 13, 2022 · 3 comments · Fixed by #1601
Closed

AOP do not support '*' on class field with execution pointcut designator #1580

Sochene opened this issue Apr 13, 2022 · 3 comments · Fixed by #1601
Labels
type: bug A general bug
Milestone

Comments

@Sochene
Copy link

Sochene commented Apr 13, 2022

When I test samples/class-proxies-aop, modify the LoggableAspect.java GraalvmDemoApplication,java
@Pointcut("execution(* com.example.graalvmdemo.rest.Person*.demo(..))")

@AotProxyHint(targetClass=com.example.graalvmdemo.rest.PersonController.class,proxyFeatures = ProxyBits.IS_STATIC)
@AotProxyHint(targetClass=com.example.graalvmdemo.rest.PersonController2.class,proxyFeatures = ProxyBits.IS_STATIC)

it build success, but run failed with logs below

2022-04-13 19:31:50.574 ERROR 2674732 --- [           main] o.s.boot.SpringApplication               : Application run failed

org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:163) ~[na:na]
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:577) ~[na:na]
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145) ~[na:na]
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:740) ~[class-proxies-aop:2.6.6]
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:415) ~[class-proxies-aop:2.6.6]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:303) ~[class-proxies-aop:2.6.6]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1312) ~[class-proxies-aop:2.6.6]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1301) ~[class-proxies-aop:2.6.6]
	at com.example.graalvmdemo.GraalvmDemoApplication.main(GraalvmDemoApplication.java:13) ~[class-proxies-aop:0.0.1-SNAPSHOT]
Caused by: org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat
	at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:142) ~[na:na]
	at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.<init>(TomcatWebServer.java:104) ~[na:na]
	at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getTomcatWebServer(TomcatServletWebServerFactory.java:478) ~[na:na]
	at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:211) ~[na:na]
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:182) ~[na:na]
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:160) ~[na:na]
	... 8 common frames omitted
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestContextFilter': Initialization of bean failed; nested exception is com.oracle.svm.core.jdk.UnsupportedFeatureError: Proxy class defined by interfaces [interface org.springframework.boot.web.servlet.filter.OrderedFilter, interface javax.servlet.Filter, interface org.springframework.beans.factory.BeanNameAware, interface org.springframework.context.EnvironmentAware, interface org.springframework.core.env.EnvironmentCapable, interface org.springframework.web.context.ServletContextAware, interface org.springframework.beans.factory.InitializingBean, interface org.springframework.beans.factory.DisposableBean] not found. Generating proxy classes at runtime is not supported. Proxy classes need to be defined at image build time by specifying the list of interfaces that they implement. To define proxy classes use -H:DynamicProxyConfigurationFiles=<comma-separated-config-files> and -H:DynamicProxyConfigurationResources=<comma-separated-config-resources> options.
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:628) ~[na:na]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[na:na]
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[na:na]
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[na:na]
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[na:na]
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:213) ~[na:na]
	at org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(ServletContextInitializerBeans.java:212) ~[na:na]
	at org.springframework.boot.web.servlet.ServletContextInitializerBeans.addAsRegistrationBean(ServletContextInitializerBeans.java:175) ~[na:na]
	at org.springframework.boot.web.servlet.ServletContextInitializerBeans.addAsRegistrationBean(ServletContextInitializerBeans.java:170) ~[na:na]
	at org.springframework.boot.web.servlet.ServletContextInitializerBeans.addAdaptableBeans(ServletContextInitializerBeans.java:155) ~[na:na]
	at org.springframework.boot.web.servlet.ServletContextInitializerBeans.<init>(ServletContextInitializerBeans.java:87) ~[na:na]
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.getServletContextInitializerBeans(ServletWebServerApplicationContext.java:260) ~[na:na]
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.selfInitialize(ServletWebServerApplicationContext.java:234) ~[na:na]
	at org.springframework.boot.web.embedded.tomcat.TomcatStarter.onStartup(TomcatStarter.java:53) ~[na:na]
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5219) ~[class-proxies-aop:9.0.60]
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[na:na]
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1396) ~[na:na]
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1386) ~[na:na]
	at java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na]
	at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) ~[na:na]
	at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140) ~[na:na]
	at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:919) ~[na:na]
	at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:835) ~[na:na]
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[na:na]
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1396) ~[na:na]
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1386) ~[na:na]
	at java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na]
	at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) ~[na:na]
	at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140) ~[na:na]
	at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:919) ~[na:na]
	at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:263) ~[na:na]
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[na:na]
	at org.apache.catalina.core.StandardService.startInternal(StandardService.java:432) ~[na:na]
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[na:na]
	at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:927) ~[na:na]
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[na:na]
	at org.apache.catalina.startup.Tomcat.start(Tomcat.java:486) ~[na:na]
	at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:123) ~[na:na]
	... 13 common frames omitted
Caused by: com.oracle.svm.core.jdk.UnsupportedFeatureError: Proxy class defined by interfaces [interface org.springframework.boot.web.servlet.filter.OrderedFilter, interface javax.servlet.Filter, interface org.springframework.beans.factory.BeanNameAware, interface org.springframework.context.EnvironmentAware, interface org.springframework.core.env.EnvironmentCapable, interface org.springframework.web.context.ServletContextAware, interface org.springframework.beans.factory.InitializingBean, interface org.springframework.beans.factory.DisposableBean] not found. Generating proxy classes at runtime is not supported. Proxy classes need to be defined at image build time by specifying the list of interfaces that they implement. To define proxy classes use -H:DynamicProxyConfigurationFiles=<comma-separated-config-files> and -H:DynamicProxyConfigurationResources=<comma-separated-config-resources> options.
	at com.oracle.svm.core.util.VMError.unsupportedFeature(VMError.java:89) ~[na:na]
	at com.oracle.svm.reflect.proxy.DynamicProxySupport.getProxyClass(DynamicProxySupport.java:146) ~[na:na]
	at java.lang.reflect.Proxy.getProxyConstructor(Proxy.java:66) ~[class-proxies-aop:na]
	at java.lang.reflect.Proxy.getProxyClass(Proxy.java:384) ~[class-proxies-aop:na]
	at org.springframework.util.ClassUtils.createCompositeInterface(ClassUtils.java:784) ~[na:na]
	at org.springframework.aop.aspectj.AspectJExpressionPointcut.getTargetShadowMatch(AspectJExpressionPointcut.java:437) ~[na:na]
	at org.springframework.aop.aspectj.AspectJExpressionPointcut.matches(AspectJExpressionPointcut.java:295) ~[na:na]
	at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:251) ~[na:na]
	at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:289) ~[na:na]
	at org.springframework.aop.support.AopUtils.findAdvisorsThatCanApply(AopUtils.java:321) ~[na:na]
	at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findAdvisorsThatCanApply(AbstractAdvisorAutoProxyCreator.java:128) ~[class-proxies-aop:5.3.18]
	at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findEligibleAdvisors(AbstractAdvisorAutoProxyCreator.java:97) ~[class-proxies-aop:5.3.18]
	at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.getAdvicesAndAdvisorsForBean(AbstractAdvisorAutoProxyCreator.java:78) ~[class-proxies-aop:5.3.18]
	at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:339) ~[class-proxies-aop:5.3.18]
	at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:291) ~[class-proxies-aop:5.3.18]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:455) ~[na:na]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1808) ~[na:na]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620) ~[na:na]
	... 50 common frames omitted

GraalVM Version:OpenJDK 64-Bit Server VM GraalVM CE 22.0.0.2 (build 11.0.14+9-jvmci-22.0-b05, mixed mode, sharing)

@spring-projects-issues spring-projects-issues added the status: waiting-for-triage An issue we've not yet triaged or decided on label Apr 13, 2022
@mhalbritter
Copy link
Contributor

mhalbritter commented Apr 13, 2022

Reproduced with newest graal version:

Caused by: com.oracle.svm.core.jdk.UnsupportedFeatureError: Proxy class defined by interfaces [interface org.springframework.boot.web.servlet.filter.OrderedFilter, interface javax.servlet.Filter, interface org.springframework.beans.factory.BeanNameAware, interface org.springframework.context.EnvironmentAware, interface org.springframework.core.env.EnvironmentCapable, interface org.springframework.web.context.ServletContextAware, interface org.springframework.beans.factory.InitializingBean, interface org.springframework.beans.factory.DisposableBean] not found. Generating proxy classes at runtime is not supported. Proxy classes need to be defined at image build time by specifying the list of interfaces that they implement. To define proxy classes use -H:DynamicProxyConfigurationFiles=<comma-separated-config-files> and -H:DynamicProxyConfigurationResources=<comma-separated-config-resources> options.

Interestingly, @Pointcut("execution(* com.example.graalvmdemo.rest.PersonController.demo*(..))") works.

@mhalbritter mhalbritter added type: bug A general bug and removed status: waiting-for-triage An issue we've not yet triaged or decided on labels Apr 13, 2022
@mhalbritter mhalbritter added this to the 0.12.0 milestone Apr 13, 2022
@benoit-laplante
Copy link

I had a simillar issue with aspect causing a bunch of spring mvc beans to be proxied. My aspect was:
@Before( value = "execution( * com.specific.package.*.methodPrefix*(..)) )") I was expecting only the beans under that specific package to be proxied. It looks to me it is an aop issue, proxying unnecessary beans depending where the wildcard is, causing no side effect on jvm.

@Sochene
Copy link
Author

Sochene commented May 2, 2022

I had a simillar issue with aspect causing a bunch of spring mvc beans to be proxied. My aspect was: @Before( value = "execution( * com.specific.package.*.methodPrefix*(..)) )") I was expecting only the beans under that specific package to be proxied. It looks to me it is an aop issue, proxying unnecessary beans depending where the wildcard is, causing no side effect on jvm.

Try to add


@TypeHint(types = {OrderedRequestContextFilter.class},access = {PUBLIC_METHODS, QUERY_PUBLIC_METHODS})

if you had same expection stack ,it should works

Sochene pushed a commit to Sochene/spring-native that referenced this issue May 3, 2022
@sdeleuze sdeleuze modified the milestones: 0.12.0, 0.12.1 May 17, 2022
Sochene pushed a commit to Sochene/spring-native that referenced this issue May 22, 2022
sdeleuze pushed a commit that referenced this issue Jun 10, 2022
sdeleuze pushed a commit that referenced this issue Jun 10, 2022
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
type: bug A general bug
Development

Successfully merging a pull request may close this issue.

5 participants