ArrayOutOfBoundsException en la creación de Bean mientras se utilizan las construcciones de Java 8
spring java-8 (2)
Recibo una ArrayIndexOutOfBoundsException
en el inicio del servicio (creación de Bean) cuando utilizo las funciones de Java 8.
Java 8 ha sido configurado y ha estado funcionando. El código se compila correctamente. Al iniciar el servicio, el servicio no puede escuchar el puerto ya que los beans no se crean. Cuando cambio el código (eliminar las construcciones de Java 8), el servicio se inicia y todo funciona bien.
Este es el código que estoy usando (el código de trabajo para el cual comienza el servicio):
for (Item itemObject : response) {
if (itemObject.hasId()) {
idList.add(String.valueOf(itemObject.Id());
}
}
Mismo código usando las construcciones de Java 8:
response.parallelStream()
.filter(itemObject -> itemObject.hasId())
.map(itemObject -> itemObject.getId())
.forEach(id -> idList.add(id));
El bean para la clase que contiene este fragmento de código se crea utilizando la exploración de componentes.
El siguiente es el mensaje de excepción cuando se usa el segundo bloque de código en lugar del primero:
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
Lo que no tiene sentido para mí es, ¿por qué se cubre el código dentro de una función (que no es el constructor de la clase de bean) al crear el bean? Le pregunto esto, porque la excepción no está ahí cuando uso la normal para bucle en lugar de la secuencia paralela. ¿No ArrayOutOfBoundsException
surgir una ArrayOutOfBoundsException
cuando se llama a la función y se usa realmente este código?
¿Cómo puedo solucionar esto?
¿Qué versión de Spring usas? Necesita actualizar a Spring 4 para usar Java 8 lambda expresiones.
Encontré un error recientemente al usar Spring 3.0.5, que parece estar arreglado en 4.0.5. Aquí están los detalles.
Si tiene una clase que tiene un constructor parametrizado y también tiene un método que usa una expresión lambda (introducida en Java 8), entonces se produce una excepción ArrayIndexOutOfException al crear un bean para esa clase.