ArrayOutOfBoundsException при создании бинов при использовании конструкций Java 8

17

Я получаю ArrayIndexOutOfBoundsException при запуске службы (создание Bean), когда я использую функции Java 8.

Java 8 настроен и работает. Код правильно компилируется. При запуске службы служба не может прослушивать порт, поскольку бобы не создаются. Когда я меняю код (удаляю java 8 constructs), начинается сервис, и все работает нормально.

Это код, который я использую (рабочий код, для которого запускается сервис):

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

Тот же код с использованием конструкций Java 8:

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

Боб для класса, содержащего этот фрагмент кода, создается с помощью проверки компонентов.

Ниже приведено сообщение об исключении, когда второй кодовый блок используется вместо первого:

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

Что для меня не имеет смысла, почему код внутри функции (который не является конструктором класса bean) закрывается при создании компонента. Я спрашиваю об этом, потому что исключения не существует, когда я использую обычный цикл for вместо параллельного потока. Если при вызове функции не возникает ArrayOutOfBoundsException , этот код действительно используется.

Как я могу это исправить?     

задан akshitBhatia 09.06.2015 в 12:12
источник

2 ответа

32

Какую версию Spring вы используете? Вам нужно обновить до Spring 4, чтобы использовать лямбда-выражения Java 8.

    
ответ дан vasekt 13.07.2015 в 10:48
источник
7

Недавно я обнаружил ошибку при использовании Spring 3.0.5, которая, как представляется, исправлена ​​в 4.0.5. Вот подробности.

Если у вас есть класс с параметризованным конструктором, а также метод, который использует выражение lambda (введенное в Java 8), тогда при создании компонента для этого класса возникает ArrayIndexOutOfException.

    
ответ дан Ash 05.06.2016 в 17:56
источник