繁体   English   中英

REST Service中的Java 8 Lambda表达式不起作用

[英]Java 8 Lambda Expression Within REST Service not working

如果我将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和Tomcat 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 at org.objectweb.asm.ClassReader.readClass(ClassReader.java:2015)at org.objectweb.asm.ClassReader.accept(ClassReader.java:469)at org.objectweb.asm.ClassReader在org.glassfish.hk2.classmodel.reflect.Parser处接受(ClassReader.java:425)在com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.handleEntry(ReadableArchiveScannerAdapter.java:165)上在(Parser.java:362)上获得5。 )的com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.onSelectedEntries(ReadableArchiveScannerAdapter.java:127)的org.glassfish.hk2.classmodel.reflect.Parser.doJob(Parser.java:347)的org.glassfish.hk2。 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 java.util.concurrent.FutureTask.run(FutureTask.java:266)的java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)的.call(Parser.java:295)。线 PoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)在java.lang.Thread.run(Thread.java:744)

我找到了解决方案! 我正在使用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>

我删除了并添加:

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

当然,我必须将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>

现在一切正常。 问题是:为什么当我从REST类中删除它们并将它们放入非REST类中时,lambda表达式仍会失败? 只是我包含Jersey 1.x的事实足以在使用lambda表达式时崩溃(无论是否涉及实际的REST服务)。 但无论如何,我很高兴该项目再次正常进行。 无论如何,我一直想升级到最新版本的jax-rs&Jersey,所以这迫使我去做(花了我几个小时的工作,需要向“ SCRUM管理员”解释为什么我的估计不正确(不要现在,如果我只能弄清楚为什么Jersey 2在告诉XML返回JSON时返回XML,我将回到正轨。

谢谢大家的帮助!

Jersey 1.19与JDK 1.8.0兼容。 请参阅Jersey 1.19发行摘要, 在Jersey 1.19中对JDK8进行支持,在Jersey 1.19中 重新 打包 ASM lib。

由于jersey-server-1.19.jar已重新包装了asm 5.0,因此请删除asm-3.1.jar。

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

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

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

在引入lamdas之后,当尝试使用Java 1.8运行junit测试时,我摆脱了这个特殊错误,因此我不得不将spring升级到4.3.6.RELEASE,将junit升级到4.12。

除了所有其他答案之外,

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

解;

我将Glassfish to 4.1(build 13)升级Glassfish to 4.1(build 13) ,它解决了该问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM