REST服务中的Java 8 Lambda表达式无法正常工作

如果我将一个Java 8 Lambda表达式放在REST服务中,它就会崩溃。 如果我删除lambda表达式,它的工作原理。 如果我使用lambda表达式并不重要。 只是存在lambda足以崩溃。 Java 8相关的所有其他内容似乎都有效。

以下是我的代码(简化):

@Path("finance") public class FinanceRest { @GET @Produces("text/plain") public String speak() { return "Hello world."; } private void lambdaFunction(Predicate predicate) { // Any lambda will cause problems, no matter how simple List numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); Stream onlyOdds = numbers.stream().filter(n -> n%2 != 0); } } 

从上面的代码中可以看出,只有lambda表达式的存在才会导致失败。 一旦我删除lambda,它工作正常。 其他Java 8的东西很好(例如,“Predicate”输入参数)。

我得到的错误消息是: java.lang.ArrayIndexOutOfBoundsException:25980

我已经在使用Java 8的Tomcat 7和8上尝试了这个。我使用JavaEE 6中的标准jax-rs …换句话说,我的POM文件有:

   javax javaee-web-api 6.0 provided  

任何帮助,将不胜感激。 谢谢。

确切的错误消息(在Glassfish 4.0上……我已经尝试过Tomcat和Glassfish)是:

java.lang.ArrayIndexOutOfBoundsException:52264 at org.objectweb.asm.ClassReader.readClass(ClassReader.java:2015)atg.objectweb.asm.ClassReader.accept(ClassReader.java:469)org.objectweb.asm.ClassReader。接受(ClassReader.java:425)org.glassfish.hk2.classmodel.reflect.Parser $ 5.on(Parser.java:362)com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.handleEntry(ReadableArchiveScannerAdapter.java:165 )位于org.glassfish.hk2的org.glassfish.hk2.classmodel.reflect.Parser.doJob(Parser.java:347)的com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.onSelectedEntries(ReadableArchiveScannerAdapter.java:127)。 classmodel.reflect.Parser.access $ 300(Parser.java:67)org.glassfish.hk2.classmodel.reflect.Parser $ 3.call(Parser.java:306)at org.glassfish.hk2.classmodel.reflect.Parser $ 3 .call(Parser.java:295)位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)的java.util.concurrent.FutureTask.run(FutureTask.java:266)中的java.util.concurrent。线 java.lang.Thread.run中的PoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)(Thread.java:744)

我找到了解决方案! 我使用的是Jersey 1.17.1。 当我升级到2.7时它起作用了。 我的pom文件有以下内容:

  com.sun.jersey jersey-bundle 1.17.1 compile   com.sun.jersey jersey-servlet 1.17.1 compile  

我删除了那些并添加:

  org.glassfish.jersey.containers jersey-container-servlet 2.7  

当然,我必须修改web.xml文件才能:

  javax.ws.rs.core.Application   javax.ws.rs.core.Application /rs/*  

现在一切都运转良好。 问题是:当我从REST类中删除它们并将它们放在非REST类中时,为什么lambda表达式仍然失败? 我使用lambda表达式(无论是否涉及实际的REST服务),我在使用Jersey 1.x时就足以崩溃。 但无论如何,我很高兴这个项目再次运作; 我一直想要升级到最新版本的jax-rs&Jersey,所以这迫使我这样做(花了我几个小时的工作,需要向“SCRUM大师”解释为什么我的估计是关闭的(不要让我开始讨论这个话题。现在,如果我只能弄清楚为什么Jersey 2返回XML时我告诉它返回JSON我会回到正轨。

谢谢大家的帮助!

Jersey 1.19与JDK 1.8.0兼容。 请参阅泽西岛1.19 中的Jersey 1.19 Repackage ASM lib中的Jersey 1.19 发布摘要 JDK8支持

请删除asm-3.1.jar,因为jersey-server-1.19.jar中有asm 5.0重新包装。

stacktrace显示类org.objectweb.asm.ClassReader.readClass给出了一个exception。 我想这是Glassfish内部使用的解析器。

它崩溃的原因之一是因为它没有配置为正确处理给定的输入。 在这种情况下,给定的输入是一个lambda表达式,它不知道如何处理它。

您需要为Glassfish和Tomcat寻找Java 8字节码(lambda)支持。 如果不是问题,那么它可能是内部使用的解析器中的错误。

在我介绍lamdas之后尝试使用java 1.8运行junit测试时,我必须将spring升级到4.3.6.RELEASE并将junit升级到4.12才能解决此特定错误。

除了所有其他答案,

在我的系统上,这个问题出现在Glassfish 4.0(build 89)

解;

我将Glassfish to 4.1(build 13)升级Glassfish to 4.1(build 13)并解决了这个问题。

升级到asm5以获取jdk8

下载: http : //asm.ow2.org/eclipse/index.html

https://bugs.eclipse.org/bugs/show_bug.cgi?id=429992

要么

日食月神