杰西和Java 8(Lambda表达式)

10

我使用的是Jersey 1.18.1版本(com.sun.jersey), Spring和Java 8。如果我在REST服务中放置一个Java 8 Lambda表达式,它会崩溃。如果我删除Lambda表达式,它就可以正常工作。

@Service
@Path("/hello")
public class Hello {

    @GET
    public String hello() {
        new ArrayList<String>().stream().filter((str) -> str.length() > 0);
        return "hello";
    }

}

我使用 com.sun.jersey(版本1.18.1)。

完整堆栈跟踪:

SEVERE: Allocate exception for servlet jersey-serlvet java.lang.ArrayIndexOutOfBoundsException: 52264
    at jersey.repackaged.org.objectweb.asm.ClassReader.readClass(ClassReader.java:1976)
    at jersey.repackaged.org.objectweb.asm.ClassReader.accept(ClassReader.java:464)
    at jersey.repackaged.org.objectweb.asm.ClassReader.accept(ClassReader.java:420)
    at com.sun.jersey.spi.scanning.AnnotationScannerListener.onProcess(AnnotationScannerListener.java:138)
    at com.sun.jersey.core.spi.scanning.uri.FileSchemeScanner$1.f(FileSchemeScanner.java:86)
    at com.sun.jersey.core.util.Closing.f(Closing.java:71)
请告诉我如何修复它。

1
可能是[Java 8 Lambda表达式在REST服务中无法工作]的重复问题(https://dev59.com/6GAh5IYBdhLWcg3wBPXY)。 - andersschuller
2
是的,但是这个解决方案不起作用。我已经尝试过了。 - Malahov
@Malahov你尝试使用Jersey 2.7+,但出现了相同的问题吗? - assylias
对于com.sun.jersey的最新版本1.18.1,我没有尝试过org.glassfish.jersey。 - Malahov
有什么进展吗?我无法使用最新的Jersey依赖项使其工作。 - Seb
2个回答

10

Jersey 1.18不支持Java 8,但自从1.19版本开始就增加了对Java 8的兼容性。

如果查看Jersey 1.19版本的发布说明,可以看到它们引入了JDK8支持。

https://github.com/jersey/jersey-1.x/releases/tag/1.19

引用1.19标记:

  

感谢@cowwoc,您现在可以在JDK8上运行Jersey 1.x应用程序

要解决此问题,您需要将Jersey升级到1.19或将Java 8降级为7。


3
我们遇到了类似的问题。同时使用了 com.sun.jersey
在迁移到最新版本(19.1)后,一切都正常了。 所以,请升级到最新版本即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接