Java 8 Lambda-Ausdrücken Innerhalb von REST-Dienst nicht funktioniert

Wenn ich ein Java 8 Lambda-Ausdruck in einen REST-Dienst, stürzt es ab. Wenn ich entfernen Sie die lambda-Ausdruck, es funktioniert. Es spielt keine Rolle, wenn ich den lambda-Ausdruck oder nicht. Nur die Existenz der lambda ist genug, zum Absturz zu bringen. Alles andere Java 8 Verwandte arbeiten scheint.

Unten ist mein code (stark vereinfacht):

@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);
    }

}

Wie Sie sehen können aus dem obigen code, nur die Existenz eines lambda-Ausdrucks werden die Fehler verursachen. Sobald ich entfernen Sie die lambda, es funktioniert gut. Die anderen Java-8 Zeug in Ordnung ist (zum Beispiel das "Prädikat" input-parameter).

Die Fehlermeldung, die ich bekomme ist:
java.lang.ArrayIndexOutOfBoundsException: 25980

Ich habe versucht, diese auf Tomcat 7 und 8, die mit Java 8.
Ich bin mit dem standard jax-rs Zeug von Java ee 6.... in anderen Worten meine POM-Datei diese:

    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-web-api</artifactId>
        <version>6.0</version>
        <scope>provided</scope>
    </dependency>

Jede Hilfe würde geschätzt werden.
Danke.

Die genaue Fehlermeldung (auf Glassfish 4.0... ich habe versucht, sowohl Tomcat und Glassfish):

java.lang.ArrayIndexOutOfBoundsException: 52264 an
org.objectweb.asm.ClassReader.readClass(ClassReader.java:2015)
org.objectweb.asm.ClassReader.akzeptieren(ClassReader.java:469) at
org.objectweb.asm.ClassReader.akzeptieren(ClassReader.java:425) an
org.glassfish.hk2.classmodel.reflektieren.Parser,$5.auf(Parser.java:362) at
com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.handleEntry(ReadableArchiveScannerAdapter.java:165)
bei
com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.onSelectedEntries(ReadableArchiveScannerAdapter.java:127)
bei org.glassfish.hk2.classmodel.reflektieren.Parser.doJob(Parser.java:347)
bei
org.glassfish.hk2.classmodel.reflektieren.Parser.Zugriff auf$300(Parser.java:67)
bei
org.glassfish.hk2.classmodel.reflektieren.Parser,$3.call(Parser.java:306)
bei
org.glassfish.hk2.classmodel.reflektieren.Parser,$3.call(Parser.java:295)
bei java.util.gleichzeitige.FutureTask.run(FutureTask.java:266) at
java.util.gleichzeitige.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
bei
java.util.gleichzeitige.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
bei java.lang.Thread.run(Thread.java:744)

Ich hasse es zu sagen, dass es klingt wie ein bug, aber es funktioniert. Nur das hinzufügen eines lambda-Ausdrucks sollte nicht brechen JAX-RS-Implementierungen.
Sie verwenden müssen, Tomcat 8, nicht 7. Stellen Sie sicher, dass JAVA_HOME wies auf die Java8 JRE, tomcat so wird es abholen. Other than, die ich bin mir nicht wirklich sicher, was das Problem sein könnte.
Java 8 läuft auf Tomcat 7 als gut. Ich habe eine Instanz die Ausführung von Java 8 ohne Probleme. Nur stellen Sie sicher, dass die version 7.52+ (glaube ich)
Sind Sie die neuen Java-8-bytecode-Konstrukte? (Lambda, etc.)
Können Sie nach dem vollständigen stacktrace des Fehlers?

InformationsquelleAutor David Jensen | 2014-04-07

Schreibe einen Kommentar