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
は発生しません。
どうすれば修正できますか?
どのバージョンのSpringを使用していますか? Java 8ラムダ式を使用するには、Spring 4にアップグレードする必要があります。
Spring 3.0.5を使用しているときにバグを最近発見しました。これは4.0.5で修正されたようです。詳細はこちらです。
パラメーター化されたコンストラクターを持ち、ラムダ式(Java 8)で導入)を使用するメソッドもあるクラスがある場合、そのクラスのBeanを作成するときにArrayIndexOutOfExceptionが発生します。