REST 服务中的 Java 8 Lambda 表达式不起作用
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/22917462/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Java 8 Lambda Expression Within REST Service not working
提问by David Jensen
If I put a Java 8 Lambda expression in a REST service, it crashes. If I remove the lambda expression, it works. It does not matter if I use the lambda expression or not. Just the existence the lambda is enough to crash. Everything else Java 8 related seems to work.
如果我将 Java 8 Lambda 表达式放在 REST 服务中,它会崩溃。如果我删除 lambda 表达式,它就可以工作。我是否使用 lambda 表达式并不重要。仅仅存在 lambda 就足以崩溃。与 Java 8 相关的所有其他内容似乎都有效。
Below is my code (simplified):
下面是我的代码(简化):
@Path("finance")
public class FinanceRest {
@GET
@Produces("text/plain")
public String speak() {
return "Hello world.";
}
private void lambdaFunction(Predicate<Account> predicate) {
// Any lambda will cause problems, no matter how simple
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
Stream<Integer> onlyOdds = numbers.stream().filter(n -> n%2 != 0);
}
}
As you can see from the code above, just the existence of a lambda expression will cause failure. As soon as I remove the lambda, it works fine. The other Java 8 stuff is fine (for example, the "Predicate" input parameter).
从上面的代码可以看出,仅仅存在一个 lambda 表达式就会导致失败。一旦我删除了 lambda,它就可以正常工作。其他 Java 8 的东西很好(例如,“谓词”输入参数)。
The error message I'm getting is: java.lang.ArrayIndexOutOfBoundsException: 25980
我收到的错误消息是: java.lang.ArrayIndexOutOfBoundsException: 25980
I've tried this on Tomcat 7 and 8 using Java 8. I'm using the standard jax-rs stuff from JavaEE 6.... in other words my POM file has this:
我已经使用 Java 8 在 Tomcat 7 和 8 上尝试过这个。我使用的是来自 JavaEE 6 的标准 jax-rs 东西......换句话说,我的 POM 文件有这个:
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
Any help would be appreciated. Thanks.
任何帮助,将不胜感激。谢谢。
The exact error message (on Glassfish 4.0... I've tried both Tomcat and Glassfish) is:
确切的错误消息(在 Glassfish 4.0 上……我已经尝试过 Tomcat 和 Glassfish)是:
java.lang.ArrayIndexOutOfBoundsException: 52264 at org.objectweb.asm.ClassReader.readClass(ClassReader.java:2015) at org.objectweb.asm.ClassReader.accept(ClassReader.java:469) at org.objectweb.asm.ClassReader.accept(ClassReader.java:425) at org.glassfish.hk2.classmodel.reflect.Parser$5.on(Parser.java:362) at com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.handleEntry(ReadableArchiveScannerAdapter.java:165) at com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.onSelectedEntries(ReadableArchiveScannerAdapter.java:127) at org.glassfish.hk2.classmodel.reflect.Parser.doJob(Parser.java:347) at org.glassfish.hk2.classmodel.reflect.Parser.access$300(Parser.java:67) at org.glassfish.hk2.classmodel.reflect.Parser$3.call(Parser.java:306) at org.glassfish.hk2.classmodel.reflect.Parser$3.call(Parser.java:295) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:744)
java.lang.ArrayIndexOutOfBoundsException: 52264 at org.objectweb.asm.ClassReader.readClass(ClassReader.java:2015) at org.objectweb.asm.ClassReader.accept(ClassReader.java:469) at org.objectweb.asm.ClassReader。 accept(ClassReader.java:425) at org.glassfish.hk2.classmodel.reflect.Parser$5.on(Parser.java:362) at com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.handleEntry(ReadableArchiveScannerAdapter.java:165) ) 在 com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.onSelectedEntries(ReadableArchiveScannerAdapter.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) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor $Worker.run(ThreadPoolExecutor.java:617) 在 java.lang.Thread.run(Thread.java:744)
回答by skiwi
The stacktrace shows that the class org.objectweb.asm.ClassReader.readClass
gives an exception. I suppose this is a parser that Glassfish uses internally.
堆栈跟踪显示该类org.objectweb.asm.ClassReader.readClass
给出了异常。我想这是 Glassfish 内部使用的解析器。
One of the reasons it would crash, is because it is not configured to handle the given input properly. In this case the given input is a lambda expression and it does not know how to handle it.
它会崩溃的原因之一是因为它没有配置为正确处理给定的输入。在这种情况下,给定的输入是一个 lambda 表达式,它不知道如何处理它。
You will need to look for Java 8 bytecode (lambda) support for Glassfish and Tomcat. If it is not the issue, then it might be a bug in the parser that is internally used.
您需要寻找对 Glassfish 和 Tomcat 的 Java 8 字节码 (lambda) 支持。如果不是问题,则可能是内部使用的解析器中的错误。
回答by David Jensen
I found the solution! I was using Jersey 1.17.1. When I upgraded to 2.7 it worked. My pom file had the following:
我找到了解决方案!我使用的是泽西岛 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>
I removed those and added:
我删除了这些并添加了:
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>2.7</version>
</dependency>
And of course I had to modify the web.xml file to have:
当然,我必须修改 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>
Now everything is working well. The question is:Why were lambda expressions still failing when I removed them from the REST class and put them in a non-REST class? Just the fact I was including Jersey 1.x was enough to crash when using lambda expressions (whether or not an actual REST service was involved). But at any rate, I'm pleased the project is working again; I had been wanting to upgrade to the latest version of jax-rs & Jersey anyway so this forced me to do it (costing me several hours of work and need to explain to the "SCRUM master" why my estimate is off (don't get me started on that topic). Now if I can only figure out why Jersey 2 is returning XML when I told it to return JSON I'll be back on track.
现在一切正常。问题是:当我从 REST 类中删除它们并将它们放入非 REST 类时,为什么 lambda 表达式仍然失败?我包含 Jersey 1.x 的事实足以在使用 lambda 表达式时崩溃(无论是否涉及实际的 REST 服务)。但无论如何,我很高兴这个项目又开始工作了;无论如何,我一直想升级到最新版本的 jax-rs & Jersey 所以这迫使我这样做(花费了我几个小时的工作,并且需要向“SCRUM master”解释为什么我的估计是错误的(不要让我开始这个话题)。现在,如果我能弄清楚为什么 Jersey 2 在我告诉它返回 JSON 时返回 XML,我将回到正轨。
Thanks everyone for your help!
感谢大家的帮助!
回答by Tom Shen
Jersey 1.19 is compatible with JDK 1.8.0. Refer to Jersey 1.19 Release summaryJDK8 support in Jersey 1.19Repackage ASM lib in Jersey 1.19
Jersey 1.19 与 JDK 1.8.0 兼容。请参阅 Jersey 1.19 发布摘要 Jersey 1.19 中的JDK8 支持重新打包 Jersey 1.19 中的ASM 库
Please remove asm-3.1.jar since jersey-server-1.19.jar has asm 5.0 repacked in it.
请删除 asm-3.1.jar,因为 jersey-server-1.19.jar 中重新打包了 asm 5.0。
回答by Yusuf K.
In addition to all other answers,
除了所有其他答案,
On my system this problem is occured on Glassfish 4.0(build 89)
在我的系统上这个问题发生在 Glassfish 4.0(build 89)
Solution;
解决方案;
I upgraded
Glassfish to 4.1(build 13)
and it solved that problem.
我升级了
Glassfish to 4.1(build 13)
,它解决了这个问题。
回答by David B
I had to upgrade spring to 4.3.6.RELEASE and junit to 4.12 before I got rid of this particular error when trying to run a junit test with java 1.8 after I had introduced lamdas.
在我引入 lamdas 后尝试使用 java 1.8 运行 junit 测试时,我不得不将 spring 升级到 4.3.6.RELEASE 并将 junit 升级到 4.12,然后才能摆脱这个特定的错误。