When is the proper moment to add a ServletRequestListener/AsyncListener? I have tried this in the requestHandler of a VaadinSession but i got this exception :
com.vaadin.flow.server.ServiceException: java.lang.IllegalStateException
at com.vaadin.flow.server.VaadinService.handleExceptionDuringRequest(VaadinService.java:1645)
at com.vaadin.flow.server.VaadinService.handleRequest(VaadinService.java:1596)
at com.vaadin.flow.server.VaadinServlet.service(VaadinServlet.java:398)
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:723)
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.websocket.servlet.WebSocketUpgradeFilter.doFilter(WebSocketUpgradeFilter.java:195)
at org.eclipse.jetty.ee10.servlet.FilterHolder.doFilter(FilterHolder.java:205)
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:431)
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:703)
at org.eclipse.jetty.server.handler.ContextHandler.handle(ContextHandler.java:851)
at org.eclipse.jetty.server.Handler$Sequence.handle(Handler.java:805)
at org.eclipse.jetty.server.Server.handle(Server.java:179)
at org.eclipse.jetty.server.internal.HttpChannelState$HandlerInvoker.run(HttpChannelState.java:619)
at org.eclipse.jetty.server.internal.HttpConnection.onFillable(HttpConnection.java:411)
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.ssl.SslConnection$SslEndPoint.onFillable(SslConnection.java:574)
at org.eclipse.jetty.io.ssl.SslConnection.onFillable(SslConnection.java:390)
at org.eclipse.jetty.io.ssl.SslConnection$2.succeeded(SslConnection.java:150)
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.IllegalStateException
at org.eclipse.jetty.ee10.servlet.ServletContextHandler$ServletContextApi.addListener(ServletContextHandler.java:2601)
at
.....
at com.vaadin.flow.server.communication.SessionRequestHandler.handleRequest(SessionRequestHandler.java:64)
at com.vaadin.flow.server.VaadinService.handleRequest(VaadinService.java:1584)
ServletRequestListener and AsyncListener are registered with the ServletContext. They need to be registered in the servlet init phase before the application starts handling requests. If you want to do that in a Vaadin context, then serviceInit in VaadinServiceInitListener is probably the most appropriate location.
Do you know how to get the ServletContext from the VaadinInitListener?
@FunctionalInterface
public interface VaadinServiceInitListener extends EventListener, Serializable {
/**
* Run when a {@link VaadinService} instance is initialized.
*
* @param event
* the service initialization event
*/
void serviceInit(ServiceInitEvent event);
}
Caused by: java.lang.IllegalStateException
at org.eclipse.jetty.ee10.servlet.ServletContextHandler$ServletContextApi.addListener(ServletContextHandler.java:2601) ~[jetty-ee10-servlet-12.0.8.jar:12.0.8]
at ...
at com.vaadin.flow.server.VaadinService.lambda$init$0(VaadinService.java:239) ~[flow-server-24.4.7.jar:24.4.7]
at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133) ~[?:?]
at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1939) ~[?:?]
at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762) ~[?:?]
at com.vaadin.flow.server.VaadinService.lambda$init$1(VaadinService.java:239) ~[flow-server-24.4.7.jar:24.4.7]
at com.vaadin.flow.server.VaadinService.runWithServiceContext(VaadinService.java:2379) ~[flow-server-24.4.7.jar:24.4.7]
at com.vaadin.flow.server.VaadinService.init(VaadinService.java:237) ~[flow-server-24.4.7.jar:24.4.7]
at com.vaadin.flow.server.VaadinServlet.createServletService(VaadinServlet.java:355) ~[flow-server-24.4.7.jar:24.4.7]
at com.vaadin.flow.server.VaadinServlet.createServletService(VaadinServlet.java:336) ~[flow-server-24.4.7.jar:24.4.7]
at com.vaadin.flow.server.VaadinServlet.init(VaadinServlet.java:132) ~[flow-server-24.4.7.jar:24.4.7]
at org.eclipse.jetty.ee10.servlet.ServletHolder.initServlet(ServletHolder.java:637) ~[jetty-ee10-servlet-12.0.8.jar:12.0.8]
... 29 more
But is ok, I think i will not need it because
event.addRequestHandler will be enough for what i need.
Just for future reference, my next attempt would have been to use the regular Servlet API mechanisms such as @WebListener or declaring the listener class in web.xml. The tricky part is that this happens outside of Vaadin which means that you might have to use some global variable or such if you want to hook it up with Vaadin-specific things.