Подтвердить что ты не робот

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

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

Java 8 настроен и работает. Код правильно компилируется. При запуске службы служба не может прослушивать порт, поскольку beans не создается. Когда я меняю код (удаляю 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));

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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