2017-01-06 4 views
0

Der folgende unschuldige API-Aufruf führt zum Absturz der gesamten Jersey-Webanwendung.Sortierliste löst ArrayIndexOutOfBoundsException aus

@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; } 
    } 
} 

Es wirft

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) 

Aber warum? Selbst das Synchronisieren der Sortieroperation hat keine Auswirkung. Könnte das ein Fehler in einer der folgenden Technologien sein? Können Sie dieses Problem duplizieren?

  • Tomcat 7.0.73
  • Jersey 1.19.3
  • Jetty 9.4.0.v20161208
  • ASM 5.0.4
+2

Nun, der Stack-Trace sieht aus wie die Ausnahme im Konstruktor ist für 'ClassReader', nicht Ihre Klasse ... Was machen Sie denken, dass es etwas bekommt ist mit' sort() 'Methode zu tun? –

+0

Da diese Methode allein die Anwendung abstürzt, nichts anderes. Anscheinend unterstützt Jersey Java 8 nicht gut genug. Ich habe meine Lösung unten gepostet. – JasperJ

Antwort

1

Offenbar ist dies ein Bug 1.X Jersey, als Es unterstützt Java 8 nicht gut genug. Das Upgrade auf Jersey 2.X löst dieses Problem.

Eine Lösung für Jersey 1.X wäre die Verwendung eines Java 7-Ansatzes zum Sortieren.

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