web-dev-qa-db-ja.com

Java 8コンストラクトを使用中のBean作成時のArrayOutOfBoundsException

Java 8つの機能を使用すると、サービスの起動(Bean作成)でArrayIndexOutOfBoundsExceptionが表示されます。

Java 8がセットアップされ、機能しています。コードは正しくコンパイルされます。サービスの開始時に、Beanが作成されないため、サービスはポートのリッスンに失敗します。コードを変更すると(Java 8コンストラクトを削除))サービスが開始され、すべて正常に動作します。

これは私が使用しているコードです(サービスが開始される作業コード):

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は、コンポーネントスキャンを使用して作成されます。

以下は、最初のコードブロックの代わりに2番目のコードブロックが使用された場合の例外メッセージです。

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は発生しません。

どうすれば修正できますか?

29
akshitBhatia

どのバージョンのSpringを使用していますか? Java 8ラムダ式を使用するには、Spring 4にアップグレードする必要があります。

53
vasekt

Spring 3.0.5を使用しているときにバグを最近発見しました。これは4.0.5で修正されたようです。詳細はこちらです。

パラメーター化されたコンストラクターを持ち、ラムダ式(Java 8)で導入)を使用するメソッドもあるクラスがある場合、そのクラスのBeanを作成するときにArrayIndexOutOfExceptionが発生します。

16
Ash