REST服务中的Java 8 Lambda表达式不工作
如果我在REST服务中放入Java8Lambda表达式,它就会崩溃。如果我删除lambda表达式,它就会工作。我是否使用lambda表达式并不重要。只要存在lambda就足以崩溃。其他与Java8相关的东西似乎都能工作 下面是我的代码(简化):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
@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)支持。如果不是问题所在,则可能是内部使用的解析器中的错误。堆栈跟踪显示类
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.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类时,为什么lambda表达式仍然失败?仅是我包含Jersey 1.x就足以在使用lambda表达式时崩溃(无论是否涉及实际的REST服务)