在App Engine上使用Spring AOP会导致StackOverflowError [英] Using Spring AOP on App Engine causes StackOverflowError

查看:205
本文介绍了在App Engine上使用Spring AOP会导致StackOverflowError的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们在App Engine上运行了一个应用程序,并使用了Spring框架。最近我们添加了一些基于AOP的新功能。我们决定使用@AspectJ风格,因此我们在基于XML的配置中添加了< aop:aspectj-autoproxy> 并实现了相应的方面。在开发服务器上一切正常,但是,在部署到云环境时,每次应用程序初始化时,都会收到 java.lang.StackOverflowError



无法创建并导致错误的bean是使用 @Configuration 注释注释的配置类。看来,基本上任何配置bean都可能导致错误。



下面您可以看到相应的堆栈跟踪。

  org.springframework.web.context.ContextLoader initWebApplicationContext:上下文初始化失败
org.springframework.beans.factory.BeanCreationException:在URL中定义的名为'objectifyConfig'罐子:文件:/基/数据/家/应用/ {APP-ID} {/8.372375422460842231/WEB-INF/lib/应用程序名} -1.0-SNAPSHOT.jar / {路径与班级} / ObjectifyConfig。类]:bean初始化失败;嵌套异常是org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:529)上的java.lang.StackOverflowError
在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory中的
。 createBean(AbstractAutowireCapableBeanFactory.java:458)
在org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:296)
在org.springframework.beans.factory.support.DefaultSingletonBeanRegistry .getSingleton(DefaultSingletonBeanRegistry.java:223)
在org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:293)
在org.springframework.beans.factory.support.AbstractBeanFactory .getBean(AbstractBeanFactory.java:194)
在org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:628)
在org.springframework.context.support.AbstractApplicationCont在org.springframework.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)上
ContextLoader.java:389)美元,org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:294 b $ b)
在org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:
at org.mortbay.jetty.handler.ContextHandler.startContext(ContextHandler.java:548)
at org.mortbay.jetty.servlet.Context.startContext(Context.java:136)
at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
at org .mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCyc le.java:50)
at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.createHandler(AppVersionHandlerMap.java:219)
at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.getHandler( AppVersionHandlerMap.java:194)
在com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:134)
在com.google.apphosting.runtime.JavaRuntime $ RequestRunnable.run( JavaRuntime.java:446)
,位于com.google.tracing.TraceContext $ TraceContextRunnable.runInContext(TraceContext.java:435)
,位于com.google.tracing.TraceContext $ TraceContextRunnable $ 1.run(TraceContext.java :442)
,位于com.google.tracing.CurrentContext.runInContext(CurrentContext.java:186)
位于com.google.tracing.TraceContext $ AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:306)
,位于com.google.tracing.TraceContext $ AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:298)
,位于com.google.tracing.TraceContext $ TraceContextRunn可以通过com.google.apphosting.runtime.ThreadGroupPool获得
的值。 java:724)
导致:java.lang.StackOverflowError $ b $在java.util.concurrent.ConcurrentSkipListSet.contains(ConcurrentSkipListSet.java:214)
在sun.misc.URLClassPath $ LoaderSearchCursor。 nextLoader(URLClassPath.java:598)
at sun.misc.URLClassPath.getLoader(URLClassPath.java:365)
at sun.misc.URLClassPath.findResource(URLClassPath.java:213)
在java.net.URLClassLoader $ 2.run(URLClassLoader.java:551)$在java.net.URLClassLoader b $ b $ 2.run(URLClassLoader.java:549)$ b $在java.security.AccessController.doPrivileged(原生方法)
在java.net.URLClassLoader.findResource(URLClassLoader.java:548)
在com.google.apphosting.runtime.security.UserClassLoader.findResource(UserClassLoader.java:723)
在java.lang.ClassLoader.getResource(ClassLoader.java:1142)
在com.google.apphosting.runtime.security.Us erClassLoader $ 3.run(UserClassLoader.java:757)
处java.security.AccessController.doPrivileged com.google.apphosting.runtime.security.UserClassLoader $ 3.run(UserClassLoader.java:751)
(本地方法)
at com.google.apphosting.runtime.security.UserClassLoader.findResource(UserClassLoader.java:751)
at java.lang.ClassLoader.getResource(ClassLoader.java:1142)
在com.google.apphosting.runtime.security.UserClassLoader $ 3.run(UserClassLoader.java:757)
在com.google.apphosting.runtime.security.UserClassLoader $ 3.run(UserClassLoader.java:751)
位于java.security.AccessController.doPrivileged(本地方法)
位于com.google.apphosting.runtime.security.UserClassLoader.findResource(UserClassLoader.java:751)
位于java.lang.ClassLoader .getResource(ClassLoader.java:1142)
,位于com.google.apphosting.runtime.security.UserClassLoader $ 3.run(UserClassLoader.java:757)
,位于com.google.apphosting.runtime.security。 UserClassLoader $ 3.run(UserClassLoader.java:751)$ b $ j jav a.security.AccessController.doPrivileged(本地方法)
位于com.google.apphosting.runtime.security.UserClassLoader.findResource(UserClassLoader.java:751)
位于java.lang.ClassLoader.getResource(ClassLoader .java:1142)
...

更新:
我把发布到App Engine问题跟踪器以及演示问题的示例应用程序。请按照 link 查看详细信息。 似乎这个问题已经在App Engine 1.9.7版本中得到解决。请参阅此处


We have an app running on App Engine and using Spring framework. Recently we have added some new features that are based on AOP. We decided to use @AspectJ style hence we added <aop:aspectj-autoproxy> into our XML based configuration and implemented respective aspects. Everything is working OK on development server, however, when deployed to the cloud environment we get java.lang.StackOverflowError every time the app is being initialized.

The bean that cannot be created and causes the error is configuration class annotated with @Configuration annotation. It seems that basically any configuration bean can cause the error.

Below you can see the corresponding stack trace.

org.springframework.web.context.ContextLoader initWebApplicationContext: Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'objectifyConfig' defined in URL [jar:file:/base/data/home/apps/{app-id}/8.372375422460842231/WEB-INF/lib/{app-name}-1.0-SNAPSHOT.jar!/{path-to-class}/ObjectifyConfig.class]: Initialization of bean failed; nested exception is java.lang.StackOverflowError
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:529)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:296)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:293)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:628)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:389)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:294)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112)
at org.mortbay.jetty.handler.ContextHandler.startContext(ContextHandler.java:548)
at org.mortbay.jetty.servlet.Context.startContext(Context.java:136)
at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.createHandler(AppVersionHandlerMap.java:219)
at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.getHandler(AppVersionHandlerMap.java:194)
at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:134)
at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:446)
at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:435)
at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:442)
at com.google.tracing.CurrentContext.runInContext(CurrentContext.java:186)
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:306)
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:298)
at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:439)
at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251)
at java.lang.Thread.run(Thread.java:724)
Caused by: java.lang.StackOverflowError
at java.util.concurrent.ConcurrentSkipListSet.contains(ConcurrentSkipListSet.java:214)
at sun.misc.URLClassPath$LoaderSearchCursor.nextLoader(URLClassPath.java:598)
at sun.misc.URLClassPath.getLoader(URLClassPath.java:365)
at sun.misc.URLClassPath.findResource(URLClassPath.java:213)
at java.net.URLClassLoader$2.run(URLClassLoader.java:551)
at java.net.URLClassLoader$2.run(URLClassLoader.java:549)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findResource(URLClassLoader.java:548)
at com.google.apphosting.runtime.security.UserClassLoader.findResource(UserClassLoader.java:723)
at java.lang.ClassLoader.getResource(ClassLoader.java:1142)
at com.google.apphosting.runtime.security.UserClassLoader$3.run(UserClassLoader.java:757)
at com.google.apphosting.runtime.security.UserClassLoader$3.run(UserClassLoader.java:751)
at java.security.AccessController.doPrivileged(Native Method)
at com.google.apphosting.runtime.security.UserClassLoader.findResource(UserClassLoader.java:751)
at java.lang.ClassLoader.getResource(ClassLoader.java:1142)
at com.google.apphosting.runtime.security.UserClassLoader$3.run(UserClassLoader.java:757)
at com.google.apphosting.runtime.security.UserClassLoader$3.run(UserClassLoader.java:751)
at java.security.AccessController.doPrivileged(Native Method)
at com.google.apphosting.runtime.security.UserClassLoader.findResource(UserClassLoader.java:751)
at java.lang.ClassLoader.getResource(ClassLoader.java:1142)
at com.google.apphosting.runtime.security.UserClassLoader$3.run(UserClassLoader.java:757)
at com.google.apphosting.runtime.security.UserClassLoader$3.run(UserClassLoader.java:751)
at java.security.AccessController.doPrivileged(Native Method)
at com.google.apphosting.runtime.security.UserClassLoader.findResource(UserClassLoader.java:751)
at java.lang.ClassLoader.getResource(ClassLoader.java:1142)
...

Update: I put the issue into the App Engine issue tracker along with the sample app that demonstrates the problem. Please follow the link to see details.

解决方案

It seems that the issue has been fixed in App Engine version 1.9.7. See more details here.

这篇关于在App Engine上使用Spring AOP会导致StackOverflowError的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆