Come eseguo Java 8 lambda nei file JSP

Sep 25 2020

Questo è un progetto Java JSP con gestione Maven e Jetty in esecuzione in locale.

Ho un problema in cui ottengo questo errore quando si tenta di eseguire lambda in .jspffile: Lambda expressions are allowed only at source level 1.8 or above.

La mia configurazione:

  • Nella struttura del progetto in Intellij IDEA ho impostato Project SDK e Project language su Java 8.
  • Il livello del linguaggio del modulo è 8: Lambda, annotazioni di tipo ecc.
  • Utilizzando <maven.compiler.source>1.8</maven.compiler.source>e<maven.compiler.target>1.8</maven.compiler.target>
  • La versione del bytecode del progetto è impostata su 1.8
  • Ultima versione di Jetty (v9.4.31.x)
  • Il progetto utilizza il jetty-jspc-maven-pluginplugin dove ho impostato sourceVersione targetVersion1.8 in<configuration>

C'è qualcosa che mi manca o Java 8 semplicemente non è possibile con JSP / jspc

Risposte

JoakimErdfelt Sep 25 2020 at 20:59

L'esistente https://github.com/jetty-project/embedded-jetty-jspha un esempio di configurazione di compilerSourceVMe compilerTargetVMper consentire *.jspai file di utilizzare le funzionalità di Java 8, come lambda.

Fondamentalmente configuri il tuo JettyJspServlet

// Create / Register JSP Servlet (must be named "jsp" per spec)
ServletHolder holderJsp = new ServletHolder("jsp", JettyJspServlet.class);
holderJsp.setInitOrder(0);
holderJsp.setInitParameter("logVerbosityLevel", "DEBUG");
holderJsp.setInitParameter("fork", "false");
holderJsp.setInitParameter("xpoweredBy", "false");
holderJsp.setInitParameter("compilerTargetVM", "1.8");
holderJsp.setInitParameter("compilerSourceVM", "1.8");
holderJsp.setInitParameter("keepgenerated", "true");
servletContextHandler.addServlet(holderJsp, "*.jsp");

Sono andato avanti e ho aggiunto un lambda.jsp che utilizza un semplice lambda all'interno di un JSP per dimostrarlo. (lambda mescolato con JspWriter di jsp è piuttosto complicato, non è stata la migliore scelta di esempio a vista d'occhio)