2017-01-06 5 views
0

Следующий невинный вызов API вызывает сбой всего веб-приложения Джерси.Сортировка списка бросает 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
  • Jetty 9.4.0.v20161208
  • ASM 5.0.4
+2

Ну что трассировка стека выглядит как исключение в конструкторе 'ClassReader', а не вашего класса ... Что заставляет вас думать, что есть что-нибудь сделать с вашим' сортировки) 'метода (? –

+0

Поскольку этот метод сам по себе вызывает сбои приложения, ничего другого. Видимо, Джерси не поддерживает Java 8 достаточно хорошо. Я разместил решение ниже. – JasperJ

ответ

1

По-видимому, это Джерси Bug 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()); 
    } 
}); 
Смежные вопросы