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)
Actualiza a asm5 para jdk8
descargar: http://asm.ow2.org/eclipse/index.html
https://bugs.eclipse.org/bugs/show_bug.cgi?id=429992
o
eclipse luna
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.
Jersey 1.19 es compatible con JDK 1.8.0. Consulte Jersey 1.19 Resumen de la versión Soporte JDK8 en Jersey 1.19 Reenvasado ASM lib en Jersey 1.19
Elimine asm-3.1.jar ya que jersey-server-1.19.jar tiene asm 5.0 reempaquetado en él.
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.