Hi.
We randomly get this error in our Jetty 12 application which uses JSTL (ee10-jstl.mod). I say random (race condition? classpath conflict?) because the same URL/JSP that generates the error works OK when reloading. We only see it randomly in production and cannot reproduce it locally.
org.apache.jasper.JasperException: java.lang.NullPointerException: Cannot invoke "jakarta.servlet.jsp.tagext.BodyContent.getString()" because "this.bodyContent" is null
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:490)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:377)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:325)
at org.eclipse.jetty.ee10.jsp.JettyJspServlet.service(JettyJspServlet.java:101)
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:614)
at org.eclipse.jetty.ee10.servlet.ServletHolder$NotAsync.service(ServletHolder.java:1379)
at org.eclipse.jetty.ee10.servlet.ServletHolder.handle(ServletHolder.java:736)
at org.eclipse.jetty.ee10.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1614)
at org.eclipse.jetty.ee10.servlet.ServletHandler$MappedServlet.handle(ServletHandler.java:1547)
at org.eclipse.jetty.ee10.servlet.Dispatcher.forward(Dispatcher.java:126)
...
at org.eclipse.jetty.ee10.servlet.FilterHolder.doFilter(FilterHolder.java:208)
at org.eclipse.jetty.ee10.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1586)
at org.eclipse.jetty.ee10.servlet.ServletHandler$MappedServlet.handle(ServletHandler.java:1547)
at org.eclipse.jetty.ee10.servlet.ServletChannel.dispatch(ServletChannel.java:819)
at org.eclipse.jetty.ee10.servlet.ServletChannel.handle(ServletChannel.java:436)
at org.eclipse.jetty.ee10.servlet.ServletHandler.handle(ServletHandler.java:464)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:575)
at org.eclipse.jetty.ee10.servlet.SessionHandler.handle(SessionHandler.java:717)
at org.eclipse.jetty.server.handler.ContextHandler.handle(ContextHandler.java:1060)
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:151)
at org.eclipse.jetty.server.handler.gzip.GzipHandler.handle(GzipHandler.java:611)
at org.eclipse.jetty.server.Server.handle(Server.java:182)
at org.eclipse.jetty.server.internal.HttpChannelState$HandlerInvoker.run(HttpChannelState.java:662)
at org.eclipse.jetty.server.internal.HttpConnection.onFillable(HttpConnection.java:418)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:322)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:99)
at org.eclipse.jetty.io.SelectableChannelEndPoint$1.run(SelectableChannelEndPoint.java:53)
at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.runTask(AdaptiveExecutionStrategy.java:478)
at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.consumeTask(AdaptiveExecutionStrategy.java:441)
at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.tryProduce(AdaptiveExecutionStrategy.java:293)
at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.run(AdaptiveExecutionStrategy.java:201)
at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:311)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:979)
at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.doRunJob(QueuedThreadPool.java:1209)
at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1164)
at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: java.lang.NullPointerException: Cannot invoke "jakarta.servlet.jsp.tagext.BodyContent.getString()" because "this.bodyContent" is null
at org.apache.taglibs.standard.tag.common.fmt.ParamSupport.doEndTag(ParamSupport.java:84)
at org.apache.jsp.WEB_002dINF.jsp.search_005flink_005fnew_jsp._jspService(search_005flink_005fnew_jsp.java:517)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:67)
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:614)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:456)
... 51 more We have not configured properties
ee10.jakarta.servlet.jsp.jstl.api.version and
ee10.jakarta.servlet.jsp.jstl.impl.version so it should be using the default versions (3.0.0 and 3.0.1).
I think we started seeing these errors after we migrated to Jetty 12.
Currently we are using the jakarta.tags namespace to define tags:
<%@ taglib prefix="fmt" uri="jakarta.tags.fmt" %>but the same problem was happening when using the old format:
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>Any idea about why this is happening and how to fix it?