使用闭包时 Spring 4 依赖注入(inject)失败

tintown 阅读:25 2025-06-02 22:19:02 评论:0

我正在使用 Java8 和 Spring 4.1.5 开发一个 Portlet 项目

我有一个用 @Service 注释的类,其中包括这一行(任何闭包都会失败)

user.getOrganizations().stream().forEach(o -> System.out.println(o));

当我部署我的 web 应用程序时,出现以下错误(省略了大量堆栈跟踪)

org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: file [C:\dev\liferay-developer-studio\DeveloperStudio\workspace\somepath\service\MyService.class]; 
     nested exception is java.lang.ArrayIndexOutOfBoundsException: 52264 
.... 
Caused by: java.lang.ArrayIndexOutOfBoundsException: 52264 
    at org.springframework.asm.ClassReader.readClass(Unknown Source) 

我在 MVN 中的依赖如下:

myGroupId:myArtifactId:war:0.0.0-SNAPSHOT 
+- com.liferay.portal:portal-service:jar:6.2.10.11:provided 
+- com.liferay.portal:util-bridges:jar:6.2.10.11:provided 
+- com.liferay.portal:util-java:jar:6.2.10.11:provided 
+- com.liferay.portal:util-taglib:jar:6.2.10.11:provided 
+- javax.portlet:portlet-api:jar:2.0:provided 
+- javax.servlet:servlet-api:jar:2.5:provided 
+- javax.servlet.jsp:jsp-api:jar:2.2:provided 
+- org.springframework:spring-webmvc-portlet:jar:4.1.5.RELEASE:provided 
|  +- org.springframework:spring-beans:jar:4.1.5.RELEASE:provided 
|  +- org.springframework:spring-context:jar:4.1.5.RELEASE:provided 
|  |  +- org.springframework:spring-aop:jar:4.1.5.RELEASE:provided 
|  |  |  \- aopalliance:aopalliance:jar:1.0:provided 
|  |  \- org.springframework:spring-expression:jar:4.1.5.RELEASE:provided 
|  +- org.springframework:spring-core:jar:4.1.5.RELEASE:provided 
|  |  \- commons-logging:commons-logging:jar:1.2:provided 
|  +- org.springframework:spring-web:jar:4.1.5.RELEASE:provided 
|  \- org.springframework:spring-webmvc:jar:4.1.5.RELEASE:provided 
+- org.springframework:spring-test:jar:4.1.5.RELEASE:test 
+- org.mockito:mockito-all:jar:1.10.8:test 
+- junit:junit:jar:4.11:test 
|  \- org.hamcrest:hamcrest-core:jar:1.3:test 
+- org.powermock:powermock-module-junit4:jar:1.5.1:test 
|  \- org.powermock:powermock-module-junit4-common:jar:1.5.1:test 
|     \- org.powermock:powermock-reflect:jar:1.5.1:test 
|        \- org.objenesis:objenesis:jar:1.2:test 
+- org.powermock:powermock-module-junit4-rule-agent:jar:1.5.1:test 
|  +- org.powermock:powermock-module-javaagent:jar:1.5.1:test 
|  \- org.powermock:powermock-core:jar:1.5.1:test 
|     \- org.javassist:javassist:jar:3.18.0-GA:test 
\- org.powermock:powermock-api-mockito:jar:1.5.1:test 
   \- org.powermock:powermock-api-support:jar:1.5.1:test 

到目前为止我找到的每个解决方案都说“如果您正在使用 spring 3 更新到 spring 4”,但我已经在使用它了

有什么想法吗?

干杯

请您参考如下方法:

原来问题是我正在使用的容器 - Liferay - 有一个旧版本的 Spring(3.something)。

我的pom中的依赖是提供的;此外,在我的 liferay-plugin-package.properties 属性 portal-dependency-jars 中有列表中的 spring jars。

这意味着我的插件使用的是 Liferay 的库,旧版本的 ASM 无法使用新的 Java8 语法功能解析类的字节码,因此出现了损坏。

为了解决这个问题,我从 liferay-plugin-package.properties 中删除了 spring jar,并将我的 pom 中的 spring 范围设置为 compile。这解决了问题。

(注意:Liferay 目前不正式支持 Java 8,因此他们不打算升级他们的 spring 版本)


标签:Spring
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号