Dav*_*sen 25 java lambda glassfish java-8 glassfish-4
如果我将一个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);
}
}
Run Code Online (Sandbox Code Playgroud)
从上面的代码中可以看出,只有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>
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激.谢谢.
确切的错误消息(在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)at 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的java.util.concurrent.FutureTask.run(FutureTask.java:266)中.线 java.lang.Thread.run中的PoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)(Thread.java:744)
Dav*_*sen 26
我找到了解决方案!我在使用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>
Run Code Online (Sandbox Code Playgroud)
我删除了那些并添加:
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>2.7</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
当然,我必须修改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>
Run Code Online (Sandbox Code Playgroud)
现在一切都运转良好.问题是:当我从REST类中删除它们并将它们放在非REST类中时,为什么lambda表达式仍然失败?我使用lambda表达式(无论是否涉及实际的REST服务),我在使用Jersey 1.x时就崩溃了.但无论如何,我很高兴这个项目再次运作; 我一直想要升级到最新版本的jax-rs&Jersey,所以这迫使我这样做(花了我几个小时的工作,需要向"SCRUM大师"解释为什么我的估计是关闭的(不要让我开始讨论这个话题.现在,如果我只能弄清楚为什么Jersey 2返回XML时我告诉它返回JSON我会回到正轨.
谢谢大家的帮助!
小智 12
Jersey 1.19与JDK 1.8.0兼容.请参阅 Jersey 1.19 中Jersey 1.19 Repackage ASM lib中的Jersey 1.19 发布摘要JDK8支持
请删除asm-3.1.jar,因为jersey-server-1.19.jar中重新包装了asm 5.0.
堆栈跟踪显示该类org.objectweb.asm.ClassReader.readClass给出了异常。我想这是 Glassfish 内部使用的解析器。
它崩溃的原因之一是因为它没有配置为正确处理给定的输入。在这种情况下,给定的输入是 lambda 表达式,并且它不知道如何处理它。
您需要寻找 Glassfish 和 Tomcat 的 Java 8 字节码 (lambda) 支持。如果不是问题,则可能是内部使用的解析器中的错误。
| 归档时间: |
|
| 查看次数: |
11659 次 |
| 最近记录: |