ArrayOutOfBoundsException sur la création de Bean en utilisant les constructions Java 8

je suis ArrayIndexOutOfBoundsException sur le démarrage du service (Haricot création) lorsque j'utilise Java 8 fonctionnalités.

Java 8 a été mis en place et fonctionne. Le code se compile correctement. Au début du service, le service ne parvient pas à écouter le port car les haricots ne sont pas créés. Quand je change le code (supprimer les constructions java 8) le service commence et tout fonctionne bien.

C'est le code j'utilise (le code de travail pour lequel le service démarre):

for (Item itemObject : response) {
    if (itemObject.hasId()) {
        idList.add(String.valueOf(itemObject.Id());
    }
}

Même code à l'aide de Java 8 constructions:

response.parallelStream()
        .filter(itemObject -> itemObject.hasId())
        .map(itemObject -> itemObject.getId())
        .forEach(id -> idList.add(id));

le haricot de la classe contenant ce morceau de code est créé en utilisant le scan de Composant.

ce qui suit est le message d'exception lorsque le deuxième bloc de code est utilisé à la place du premier:

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

Ce qui n'a pas de sens pour moi, c'est pourquoi le code à l'intérieur d'une fonction (qui n'est pas le constructeur de la classe d'haricot) d'être couverts lors de la création du bean. Je pose cette question, parce que l'exception n'est pas là quand je utilisez la boucle normale au lieu du flux parallèle. Ne devrait pas ArrayOutOfBoundsException surviennent lorsque la fonction est appelée et que ce code est en fait utilisé.

comment je répare ça?

23
demandé sur xenteros 2015-06-09 13:12:03

2 réponses

quelle version du ressort utilisez-vous? Vous devez mettre à jour au printemps 4 pour utiliser les expressions lambda de Java 8.

39
répondu vasekt 2015-07-13 08:48:05

j'ai trouvé un bug récemment en utilisant Spring 3.0.5, qui semble être corrigé dans 4.0.5. Voici les détails.

si vous avez une classe qui a un constructeur paramétré et aussi une méthode qui utilise une expression lambda (introduite en Java 8), alors un ArrayIndexOutOfException se produit lors de la création d'un haricot pour cette classe.

10
répondu Ash 2016-06-05 15:56:02