以下无辜的API调用会崩溃整个Jersey Web应用程序。
@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)
但为什么呢?即使同步排序操作也没有效果。这可能是以下技术之一的错误吗?你能复制这个问题吗?
答案 0 :(得分:1)
显然这是Jersey Bug 1.X,因为它不能很好地支持Java 8。升级到Jersey 2.X解决了这个问题。
针对jersey 1.X的解决方案将使用Java 7方法进行排序。
Collections.sort(test, new Comparator<Dog>() {
@Override
public int compare(Dog o1, Dog o2) {
return o1.getName().compareTo(o2.getName());
}
});