使用Java 8构造时Bean创建的ArrayOutOfBoundsException

aks*_*tia 30 java spring javabeans indexoutofboundsexception java-8

我收到的ArrayIndexOutOfBoundsException时候我用Java 8特性的服务启动(创建bean).

Java 8已经建立并一直在运行.代码编译正确.在服务启动时,服务无法侦听端口,因为bean未创建.当我更改代码(删除java 8构造)时,服务启动,一切正常.

这是我正在使用的代码(服务启动的工作代码):

for (Item itemObject : response) {
    if (itemObject.hasId()) {
        idList.add(String.valueOf(itemObject.Id());
    }
}
Run Code Online (Sandbox Code Playgroud)

使用Java 8构造的相同代码:

response.parallelStream()
        .filter(itemObject -> itemObject.hasId())
        .map(itemObject -> itemObject.getId())
        .forEach(id -> idList.add(id));
Run Code Online (Sandbox Code Playgroud)

包含这段代码的类的bean是使用组件扫描创建的.

当使用第二个代码块代替第一个代码块时,以下是异常消息:

Exiting with throwable: java.lang.IllegalArgumentException: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: URL [jar:file:/workspace/.../GetContainerIdForFcSkuAdapter.class]; nested exception is java.lang.ArrayIndexOutOfBoundsException: 51880
 java.lang.IllegalArgumentException: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: URL [jar:file:/workspace....Some.class]; nested exception is java.lang.ArrayIndexOutOfBoundsException: 51880
Run Code Online (Sandbox Code Playgroud)

对我来说没有意义的是,为什么在创建bean时,函数内部的代码(不是bean类的构造函数)被覆盖.我问这个,因为当我使用普通for循环而不是并行流时,异常不存在.ArrayOutOfBoundsException当调用函数并且实际使用此代码时,不应该出现.

我该如何解决?

vas*_*ekt 54

你使用的是哪个版本的Spring?您需要升级到Spring 4才能使用Java 8 lambda表达式.


Ash*_*Ash 19

我最近在使用Spring 3.0.5时发现了一个bug,它似乎在4.0.5中得到修复.这是详细信息.

如果你有一个具有参数化构造函数的类,并且还有一个使用lambda表达式的方法(在Java 8中引入),那么在为该类创建bean时会发生ArrayIndexOutOfException.

  • 你让我远离噩梦般的头痛!谢谢 ! (6认同)
  • 我刚碰到这个,看起来很奇怪.当你向bean的构造函数添加一个参数时,就像你说的那样.我在几个地方使用forEach.我不认为我会发生这样的连接,即类中的任何地方的forEach都会破坏其bean实例化,并带有数组边界异常.哦 - 谢谢,Stack Overflow! (5认同)
  • 这不是一个真正的错误.Spring 3并不完全支持Java 8,因此使用Lambdas和Spring 3.0.5是用户错误而不是Spring错误. (4认同)