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

Spring 4 dependency injection fails when using closures

我正在使用 Java8 和 Spring 4.1.5

开发一个 Portlet 项目

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

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

当我部署我的 webapp 时,我收到以下错误(省略大量堆栈跟踪)

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

到目前为止我找到的每个解决方案都说 "If you are using spring 3 update to spring 4" 但我已经在使用它

有什么想法吗?

干杯

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

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

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

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

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