tutorial pass parameter lambdas expressions example java lambda glassfish java-8 glassfish-4

pass - lambda expression java



Java 8 Lambda Expression Within REST Service no funciona (6)

¡Encontré la solución! Estaba usando Jersey 1.17.1. Cuando actualicé a 2.7 funcionó. Mi archivo pom tenía lo siguiente:

<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>

Los eliminé y agregué:

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

Y, por supuesto, tuve que modificar el archivo web.xml para tener:

<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>

Ahora todo está funcionando bien. La pregunta es: ¿por qué todavía fallaron las expresiones lambda cuando las quité de la clase REST y las puse en una clase que no es REST? Solo el hecho de que estaba incluyendo Jersey 1.x fue suficiente para colgar al usar expresiones lambda (ya sea que se trate o no de un servicio REST real). Pero, en cualquier caso, me complace que el proyecto esté funcionando nuevamente; He querido actualizar a la última versión de jax-rs y Jersey de todos modos, así que esto me obligó a hacerlo (lo que me costó varias horas de trabajo y necesito explicarle al "maestro de SCRUM" por qué mi presupuesto está apagado). quiero que comience con ese tema). Ahora si solo puedo entender por qué Jersey 2 devuelve XML cuando le dije que devuelva JSON, volveré a la normalidad.

¡Gracias a todos por su ayuda!

Si pongo una expresión Java 8 Lambda en un servicio REST, falla. Si elimino la expresión lambda, funciona. No importa si uso la expresión lambda o no. Solo la existencia de la lambda es suficiente para estrellarse. Todo lo demás relacionado con Java 8 parece funcionar.

A continuación está mi código (simplificado):

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

Como puede ver en el código anterior, solo la existencia de una expresión lambda causará un error. Tan pronto como elimine la lambda, funciona bien. Las otras cosas de Java 8 están bien (por ejemplo, el parámetro de entrada "Predicado").

El mensaje de error que recibo es: java.lang.ArrayIndexOutOfBoundsException: 25980

He intentado esto con Tomcat 7 y 8 usando Java 8. Estoy usando las cosas jax-rs estándar de JavaEE 6 ... en otras palabras, mi archivo POM tiene esto:

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

Cualquier ayuda sería apreciada. Gracias.

El mensaje de error exacto (en Glassfish 4.0 ... He probado tanto Tomcat como Glassfish) es:

java.lang.ArrayIndexOutOfBoundsException: 52264 en org.objectweb.asm.ClassReader.readClass (ClassReader.java:2015) en org.objectweb.asm.ClassReader.accept (ClassReader.java:469) en org.objectweb.asm.ClassReader. accept (ClassReader.java:425) en org.glassfish.hk2.classmodel.reflect.Parser $ 5.on (Parser.java:362) en com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.handleEntry (ReadableArchiveScannerAdapter.java:165 ) en com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.onSelectedEntries (ReadableArchiveScannerAdapter.java:127) en org.glassfish.hk2.classmodel.reflect.Parser.doJob (Parser.java:347) en org.glassfish.hk2. classmodel.reflect.Parser.access $ 300 (Parser.java:67) en org.glassfish.hk2.classmodel.reflect.Parser $ 3.call (Parser.java:306) en org.glassfish.hk2.classmodel.reflect.Parser $ 3 .call (Parser.java:295) en java.util.concurrent.FutureTask.run (FutureTask.java:266) en java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1142) en java.util.concurrent. Hilo PoolExecutor $ Worker.run (ThreadPoolExecutor.java:617) en java.lang.Thread.run (Thread.java:744)



Además de todas las otras respuestas,

En mi sistema, este problema se produce en Glassfish 4.0(build 89)

Solución;

Actualicé Glassfish to 4.1(build 13) y resolvió ese problema.



La stacktrace muestra que la clase org.objectweb.asm.ClassReader.readClass ofrece una excepción. Supongo que este es un analizador sintáctico que Glassfish usa internamente.

Una de las razones por las que fallaría, es porque no está configurado para manejar la entrada determinada correctamente. En este caso, la entrada dada es una expresión lambda y no sabe cómo manejarla.

Deberá buscar el soporte de Java 8 bytecode (lambda) para Glassfish y Tomcat. Si no es el problema, entonces podría ser un error en el analizador que se usa internamente.


Tuve que actualizar Spring a 4.3.6.RELEASE y junit a 4.12 antes de deshacerme de este error en particular al intentar ejecutar una prueba junit con java 1.8 después de haber introducido lamdas.