REST服务中的Java 8 Lambda表达式不工作

REST服务中的Java 8 Lambda表达式不工作,java,lambda,glassfish,java-8,glassfish-4,Java,Lambda,Glassfish,Java 8,Glassfish 4,如果我在REST服务中放入Java8Lambda表达式,它就会崩溃。如果我删除lambda表达式,它就会工作。我是否使用lambda表达式并不重要。只要存在lambda就足以崩溃。其他与Java8相关的东西似乎都能工作 下面是我的代码(简化): @Path(“金融”) 公共类财务测试{ @得到 @生成(“文本/纯文本”) 公共字符串speak(){ 返回“你好,世界。”; } 私有void lambdaFunction(谓词){ //任何lambda都会导致问题,无论多么简单 列表编号=数组.a

如果我在REST服务中放入Java8Lambda表达式,它就会崩溃。如果我删除lambda表达式,它就会工作。我是否使用lambda表达式并不重要。只要存在lambda就足以崩溃。其他与Java8相关的东西似乎都能工作

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

@Path(“金融”)
公共类财务测试{
@得到
@生成(“文本/纯文本”)
公共字符串speak(){
返回“你好,世界。”;
}
私有void lambdaFunction(谓词){
//任何lambda都会导致问题,无论多么简单
列表编号=数组.asList(1,2,3,4,5,6,7,8,9);
仅限流DDS=numbers.Stream().filter(n->n%2!=0);
}
}
从上面的代码中可以看出,lambda表达式的存在将导致失败。只要我移除lambda,它就可以正常工作。另一个Java8功能很好(例如,“Predicate”输入参数)

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

我已经使用Java8在Tomcat7和8上尝试过了。 我正在使用JavaEE6中的标准jax-rs内容。。。。换句话说,我的POM文件包含以下内容:

    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-web-api</artifactId>
        <version>6.0</version>
        <scope>provided</scope>
    </dependency>

爪哇
javaeewebapi
6
假如
任何帮助都将不胜感激。 谢谢

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

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


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

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

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

我找到了解决方案! 我用的是泽西1.17.1。当我升级到2.7时,它工作了。我的pom文件包含以下内容:

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-bundle</artifactId>
    <version>1.17.1</version>
    <scope>compile</scope>
</dependency>

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-servlet</artifactId>
    <version>1.17.1</version>
    <scope>compile</scope>
</dependency>

泽西岛
球衣束
1.17.1
编译
泽西岛
泽西servlet
1.17.1
编译
我删除了这些内容并添加了:

<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet</artifactId>
    <version>2.7</version>
</dependency>

org.glassfish.jersey.containers
jersey容器servlet
2.7
当然,我必须修改web.xml文件,以便:

<servlet>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
</servlet>

<servlet-mapping>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
    <url-pattern>/rs/*</url-pattern>
</servlet-mapping>

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


感谢大家的帮助!

Jersey 1.19与JDK 1.8.0兼容。请参阅


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

除了所有其他答案

在我的系统上,此问题发生在
Glassfish 4.0(build 89)

解决方案

我将Glassfish升级到4.1(build13),它解决了这个问题


在引入lamdas之后,我尝试用java 1.8运行junit测试时,我必须先将spring升级到4.3.6.RELEASE,将junit升级到4.12,然后才能消除这个错误。

我不想说这听起来像是一个bug,但确实是。仅仅添加一个lambda表达式不应该破坏JAX-RS实现。您需要使用Tomcat 8,而不是7.Ma确保JAVA_HOME指向Java8 JRE,这样tomcat会找到它。除此之外,我不确定问题出在哪里。@Jacob断字JAVA 8也将在tomcat 7上运行。我有一个实例运行JAVA 8,没有问题。只要确保版本是7.52+(我相信)@Bart您是否正在使用任何新的Java8字节码构造?(Lambda等)您可以发布错误的完整堆栈跟踪吗?
<servlet>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
</servlet>

<servlet-mapping>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
    <url-pattern>/rs/*</url-pattern>
</servlet-mapping>