【发布时间】:2014-04-07 16:02:59
【问题描述】:
如果我将 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<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);
}
}
从上面的代码可以看出,仅仅存在 lambda 表达式就会导致失败。一旦我删除了 lambda,它就可以正常工作。其他 Java 8 的东西很好(例如,“Predicate”输入参数)。
我收到的错误消息是: java.lang.ArrayIndexOutOfBoundsException: 25980
我已经在使用 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>
任何帮助将不胜感激。 谢谢。
确切的错误消息(在 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(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) 在 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) 在 java.lang.Thread.run(Thread.java:744)
【问题讨论】:
-
我不想说这听起来像一个错误,但确实如此。仅添加 lambda 表达式不应破坏 JAX-RS 实现。
-
您将需要使用 Tomcat 8,而不是 7。确保 JAVA_HOME 指向 Java8 JRE,以便 tomcat 会选择它。除此之外,我不确定问题可能是什么。
-
@jacobhyphenated Java 8 也将在 Tomcat 7 上运行。我有一个运行 Java 8 的实例,没有任何问题。只要确保版本是 7.52+(我相信)
-
@Bart 您是否在使用任何新的 Java 8 字节码结构? (Lambda等)
-
你能发布错误的完整堆栈跟踪吗?
标签: java lambda glassfish java-8 glassfish-4