2017-01-06 7 views
0

次の無邪気なAPI呼び出しは、Jersey Webアプリケーション全体をクラッシュさせます。リストをソートするとArrayIndexOutOfBoundsExceptionがスローされる

@Path("/sortlist") 
public class SortList { 
    @GET 
    public void sort() { 
     List<Dog> test = new ArrayList<>(); 
     test.add(new Dog("test")); 
     test.add(new Dog("blah")); 
     test.sort(Comparator.comparing(Dog::getName)); 
    } 

    class Dog { 
     private String name; 
     public String getName() { return name; } 
     public Dog(String name) { this.name = name; } 
    } 
} 

それは

javax.servlet.ServletException: Servlet.init() for servlet jersey-serlvet threw exception 
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:614) 

root cause 
java.lang.ArrayIndexOutOfBoundsException: 20343 
org.objectweb.asm.ClassReader.<init>(Unknown Source) 

しかし、なぜがスローされますか?並べ替え操作を同期さえしても効果はありません。これは次のいずれかの技術のバグでしょうか?この問題を再現できますか?

  • のTomcat 7.0.73
  • ジャージー1.19.3
  • 突堤9.4.0.v20161208
  • ASM 5.0.4
+2

まあ、スタックトレースは、例外がクラスではなく、ClassReaderのコンストラクタにあるように見えます。どうすれば 'sort()'メソッドと何か関係があると思いますか? –

+0

この方法だけでアプリケーションがクラッシュするため、他に何もありません。明らかに、JerseyはJava 8を十分にサポートしていません。私は以下のソリューションを掲載しました。 – JasperJ

答えて

1

どうやら、このあるジャージーバグ1.xの、などJava 8を十分にサポートしていません。 Jersey 2.Xへのアップグレードはこの問題を解決します。

これに対するジャージー1.Xの解決策は、Java 7のソート方法を使用することです。

Collections.sort(test, new Comparator<Dog>() { 
    @Override 
    public int compare(Dog o1, Dog o2) { 
     return o1.getName().compareTo(o2.getName()); 
    } 
}); 
関連する問題