Reputation: 303
I created Java web application and trying to force atmosphere to use JSR-356 since, as I understood, it's the only way to use original javax.servlet.HttpSession
from AtmosphereResource
object.
When I deploy my application to Jetty (v. 9.3.7), I get the following errors:
16:45:16.535 [Scanner-1] ERROR org.atmosphere.util.IOUtils -
java.lang.IllegalStateException: Unable to configure jsr356 at that stage. No Servlet associated with Key[type=org.atmosphere.guice.AtmosphereGuiceServlet, annotation=[none]]
at org.atmosphere.util.IOUtils.guestRawServletPath(IOUtils.java:274) [atmosphere-runtime-2.4.3.jar:2.4.3]
at org.atmosphere.util.IOUtils.guestServletPath(IOUtils.java:248) [atmosphere-runtime-2.4.3.jar:2.4.3]
at org.atmosphere.container.JSR356AsyncSupport.<init>(JSR356AsyncSupport.java:63) [atmosphere-runtime-2.4.3.jar:2.4.3]
at org.atmosphere.container.JSR356AsyncSupport.<init>(JSR356AsyncSupport.java:40) [atmosphere-runtime-2.4.3.jar:2.4.3]
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) [na:1.8.0_74]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) [na:1.8.0_74]
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) [na:1.8.0_74]
at java.lang.reflect.Constructor.newInstance(Constructor.java:423) [na:1.8.0_74]
at org.atmosphere.cpr.DefaultAsyncSupportResolver.newCometSupport(DefaultAsyncSupportResolver.java:234) [atmosphere-runtime-2.4.3.jar:2.4.3]
at org.atmosphere.cpr.DefaultAsyncSupportResolver.resolveWebSocket(DefaultAsyncSupportResolver.java:306) [atmosphere-runtime-2.4.3.jar:2.4.3]
at org.atmosphere.cpr.DefaultAsyncSupportResolver.resolve(DefaultAsyncSupportResolver.java:292) [atmosphere-runtime-2.4.3.jar:2.4.3]
at org.atmosphere.cpr.AtmosphereFramework.autoDetectContainer(AtmosphereFramework.java:2082) [atmosphere-runtime-2.4.3.jar:2.4.3]
at org.atmosphere.cpr.AtmosphereFramework.init(AtmosphereFramework.java:914) [atmosphere-runtime-2.4.3.jar:2.4.3]
at org.atmosphere.cpr.AtmosphereFramework.init(AtmosphereFramework.java:838) [atmosphere-runtime-2.4.3.jar:2.4.3]
at org.atmosphere.cpr.AtmosphereFrameworkInitializer.configureFramework(AtmosphereFrameworkInitializer.java:75) [atmosphere-runtime-2.4.3.jar:2.4.3]
at org.atmosphere.cpr.AtmosphereServlet.configureFramework(AtmosphereServlet.java:84) [atmosphere-runtime-2.4.3.jar:2.4.3]
at org.atmosphere.cpr.AtmosphereServlet.configureFramework(AtmosphereServlet.java:80) [atmosphere-runtime-2.4.3.jar:2.4.3]
at org.atmosphere.cpr.AtmosphereServlet.init(AtmosphereServlet.java:75) [atmosphere-runtime-2.4.3.jar:2.4.3]
at com.google.inject.servlet.ServletDefinition.init(ServletDefinition.java:121) [guice-servlet-4.0.jar:na]
at com.google.inject.servlet.ManagedServletPipeline.init(ManagedServletPipeline.java:82) [guice-servlet-4.0.jar:na]
at com.google.inject.servlet.ManagedFilterPipeline.initPipeline(ManagedFilterPipeline.java:103) [guice-servlet-4.0.jar:na]
at com.google.inject.servlet.GuiceFilter.init(GuiceFilter.java:220) [guice-servlet-4.0.jar:na]
at org.eclipse.jetty.servlet.FilterHolder.initialize(FilterHolder.java:137) [jetty-servlet-9.3.7.v20160115.jar:9.3.7.v20160115]
at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:856) [jetty-servlet-9.3.7.v20160115.jar:9.3.7.v20160115]
at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:350) [jetty-servlet-9.3.7.v20160115.jar:9.3.7.v20160115]
at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1379) [jetty-webapp-9.3.7.v20160115.jar:9.3.7.v20160115]
at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1341) [jetty-webapp-9.3.7.v20160115.jar:9.3.7.v20160115]
at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:772) [jetty-server-9.3.7.v20160115.jar:9.3.7.v20160115]
at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:263) [jetty-servlet-9.3.7.v20160115.jar:9.3.7.v20160115]
at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:517) [jetty-webapp-9.3.7.v20160115.jar:9.3.7.v20160115]
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) [jetty-util-9.3.7.v20160115.jar:9.3.7.v20160115]
at org.eclipse.jetty.deploy.bindings.StandardStarter.processBinding(StandardStarter.java:41) [jetty-deploy-9.3.7.v20160115.jar:9.3.7.v20160115]
at org.eclipse.jetty.deploy.AppLifeCycle.runBindings(AppLifeCycle.java:188) [jetty-deploy-9.3.7.v20160115.jar:9.3.7.v20160115]
at org.eclipse.jetty.deploy.DeploymentManager.requestAppGoal(DeploymentManager.java:499) [jetty-deploy-9.3.7.v20160115.jar:9.3.7.v20160115]
at org.eclipse.jetty.deploy.DeploymentManager.addApp(DeploymentManager.java:147) [jetty-deploy-9.3.7.v20160115.jar:9.3.7.v20160115]
at org.eclipse.jetty.deploy.providers.ScanningAppProvider.fileAdded(ScanningAppProvider.java:180) [jetty-deploy-9.3.7.v20160115.jar:9.3.7.v20160115]
at org.eclipse.jetty.deploy.providers.WebAppProvider.fileAdded(WebAppProvider.java:458) [jetty-deploy-9.3.7.v20160115.jar:9.3.7.v20160115]
at org.eclipse.jetty.deploy.providers.ScanningAppProvider$1.fileAdded(ScanningAppProvider.java:64) [jetty-deploy-9.3.7.v20160115.jar:9.3.7.v20160115]
at org.eclipse.jetty.util.Scanner.reportAddition(Scanner.java:610) [jetty-util-9.3.7.v20160115.jar:9.3.7.v20160115]
at org.eclipse.jetty.util.Scanner.reportDifferences(Scanner.java:529) [jetty-util-9.3.7.v20160115.jar:9.3.7.v20160115]
at org.eclipse.jetty.util.Scanner.scan(Scanner.java:392) [jetty-util-9.3.7.v20160115.jar:9.3.7.v20160115]
at org.eclipse.jetty.util.Scanner$1.run(Scanner.java:329) [jetty-util-9.3.7.v20160115.jar:9.3.7.v20160115]
at java.util.TimerThread.mainLoop(Timer.java:555) [na:1.8.0_74]
at java.util.TimerThread.run(Timer.java:505) [na:1.8.0_74]
16:45:16.536 [Scanner-1] ERROR o.a.cpr.DefaultAsyncSupportResolver - Real error: Unable to configure jsr356 at that stage
java.lang.IllegalStateException: Unable to configure jsr356 at that stage
at org.atmosphere.util.IOUtils.guestRawServletPath(IOUtils.java:292) ~[atmosphere-runtime-2.4.3.jar:2.4.3]
at org.atmosphere.util.IOUtils.guestServletPath(IOUtils.java:248) ~[atmosphere-runtime-2.4.3.jar:2.4.3]
at org.atmosphere.container.JSR356AsyncSupport.<init>(JSR356AsyncSupport.java:63) ~[atmosphere-runtime-2.4.3.jar:2.4.3]
at org.atmosphere.container.JSR356AsyncSupport.<init>(JSR356AsyncSupport.java:40) ~[atmosphere-runtime-2.4.3.jar:2.4.3]
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_74]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_74]
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_74]
at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_74]
at org.atmosphere.cpr.DefaultAsyncSupportResolver.newCometSupport(DefaultAsyncSupportResolver.java:234) [atmosphere-runtime-2.4.3.jar:2.4.3]
at org.atmosphere.cpr.DefaultAsyncSupportResolver.resolveWebSocket(DefaultAsyncSupportResolver.java:306) [atmosphere-runtime-2.4.3.jar:2.4.3]
at org.atmosphere.cpr.DefaultAsyncSupportResolver.resolve(DefaultAsyncSupportResolver.java:292) [atmosphere-runtime-2.4.3.jar:2.4.3]
at org.atmosphere.cpr.AtmosphereFramework.autoDetectContainer(AtmosphereFramework.java:2082) [atmosphere-runtime-2.4.3.jar:2.4.3]
at org.atmosphere.cpr.AtmosphereFramework.init(AtmosphereFramework.java:914) [atmosphere-runtime-2.4.3.jar:2.4.3]
at org.atmosphere.cpr.AtmosphereFramework.init(AtmosphereFramework.java:838) [atmosphere-runtime-2.4.3.jar:2.4.3]
at org.atmosphere.cpr.AtmosphereFrameworkInitializer.configureFramework(AtmosphereFrameworkInitializer.java:75) [atmosphere-runtime-2.4.3.jar:2.4.3]
at org.atmosphere.cpr.AtmosphereServlet.configureFramework(AtmosphereServlet.java:84) [atmosphere-runtime-2.4.3.jar:2.4.3]
at org.atmosphere.cpr.AtmosphereServlet.configureFramework(AtmosphereServlet.java:80) [atmosphere-runtime-2.4.3.jar:2.4.3]
at org.atmosphere.cpr.AtmosphereServlet.init(AtmosphereServlet.java:75) [atmosphere-runtime-2.4.3.jar:2.4.3]
at com.google.inject.servlet.ServletDefinition.init(ServletDefinition.java:121) [guice-servlet-4.0.jar:na]
at com.google.inject.servlet.ManagedServletPipeline.init(ManagedServletPipeline.java:82) [guice-servlet-4.0.jar:na]
at com.google.inject.servlet.ManagedFilterPipeline.initPipeline(ManagedFilterPipeline.java:103) [guice-servlet-4.0.jar:na]
at com.google.inject.servlet.GuiceFilter.init(GuiceFilter.java:220) [guice-servlet-4.0.jar:na]
at org.eclipse.jetty.servlet.FilterHolder.initialize(FilterHolder.java:137) [jetty-servlet-9.3.7.v20160115.jar:9.3.7.v20160115]
at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:856) [jetty-servlet-9.3.7.v20160115.jar:9.3.7.v20160115]
at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:350) [jetty-servlet-9.3.7.v20160115.jar:9.3.7.v20160115]
at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1379) [jetty-webapp-9.3.7.v20160115.jar:9.3.7.v20160115]
at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1341) [jetty-webapp-9.3.7.v20160115.jar:9.3.7.v20160115]
at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:772) [jetty-server-9.3.7.v20160115.jar:9.3.7.v20160115]
at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:263) [jetty-servlet-9.3.7.v20160115.jar:9.3.7.v20160115]
at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:517) [jetty-webapp-9.3.7.v20160115.jar:9.3.7.v20160115]
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) [jetty-util-9.3.7.v20160115.jar:9.3.7.v20160115]
at org.eclipse.jetty.deploy.bindings.StandardStarter.processBinding(StandardStarter.java:41) [jetty-deploy-9.3.7.v20160115.jar:9.3.7.v20160115]
at org.eclipse.jetty.deploy.AppLifeCycle.runBindings(AppLifeCycle.java:188) [jetty-deploy-9.3.7.v20160115.jar:9.3.7.v20160115]
at org.eclipse.jetty.deploy.DeploymentManager.requestAppGoal(DeploymentManager.java:499) [jetty-deploy-9.3.7.v20160115.jar:9.3.7.v20160115]
at org.eclipse.jetty.deploy.DeploymentManager.addApp(DeploymentManager.java:147) [jetty-deploy-9.3.7.v20160115.jar:9.3.7.v20160115]
at org.eclipse.jetty.deploy.providers.ScanningAppProvider.fileAdded(ScanningAppProvider.java:180) [jetty-deploy-9.3.7.v20160115.jar:9.3.7.v20160115]
at org.eclipse.jetty.deploy.providers.WebAppProvider.fileAdded(WebAppProvider.java:458) [jetty-deploy-9.3.7.v20160115.jar:9.3.7.v20160115]
at org.eclipse.jetty.deploy.providers.ScanningAppProvider$1.fileAdded(ScanningAppProvider.java:64) [jetty-deploy-9.3.7.v20160115.jar:9.3.7.v20160115]
at org.eclipse.jetty.util.Scanner.reportAddition(Scanner.java:610) [jetty-util-9.3.7.v20160115.jar:9.3.7.v20160115]
at org.eclipse.jetty.util.Scanner.reportDifferences(Scanner.java:529) [jetty-util-9.3.7.v20160115.jar:9.3.7.v20160115]
at org.eclipse.jetty.util.Scanner.scan(Scanner.java:392) [jetty-util-9.3.7.v20160115.jar:9.3.7.v20160115]
at org.eclipse.jetty.util.Scanner$1.run(Scanner.java:329) [jetty-util-9.3.7.v20160115.jar:9.3.7.v20160115]
at java.util.TimerThread.mainLoop(Timer.java:555) [na:1.8.0_74]
at java.util.TimerThread.run(Timer.java:505) [na:1.8.0_74]
If I force native API to take the precedence with the following code
params.put(ApplicationConfig.WEBSOCKET_SUPPRESS_JSR356, "true");
then everything works fine.
Here is my deployment descriptor:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<listener>
<listener-class>com.sample.guice.GuiceContextListener</listener-class>
</listener>
<filter>
<filter-name>guiceFilter</filter-name>
<filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>guiceFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
The module used to provide all the bindings:
public class ServerModule extends AbstractModule
{
@Override
protected void configure()
{
install(new ServletModule() {
@Override
protected void configureServlets()
{
Map<String, String> params = new HashMap<>();
// params.put(ApplicationConfig.WEBSOCKET_SUPPRESS_JSR356, "true");
serve("/atmosphere").with(AtmosphereGuiceServlet.class, params);
}
});
}
}
I omitted the class annotated with @ManagedService
and some other code since there are no problems. As I said, everything works fine with native websocket API.
Upvotes: 3
Views: 3072
Reputation: 41
the message: Unable to configure jsr356 at that stage
means, that the jsr356 support needs to be added during ServletContextInitialization phase, the best in a ServletContextListener
my problem is that jetty 9.4 native websocket is not compatible with atmosphere anymore, on the other hand jsr356 is not compatible with guice
I managed to make jsr356 work with vaadin 8.8.1 and jetty 9.4, but it requires the VaadinServlet to be directly managed by Jetty. This doesn't work with Guice, which installs it's own GuiceFilter, and the servlets are not registered to Jetty directly.
look at JSR356WebsocketInitializer.initAtmosphereForVaadinServlet for more information
Upvotes: 2
Reputation: 1
You can just add ApplicationConfig.JSR356_MAPPING_PATH
initParameter and give it a try.
If it doesn't work ,may be you can initialize atmosphere framework explicitly and specify init param
ApplicationConfig.JSR356_MAPPING_PATH
as valid key value pair .
For initialization you can see org.atmosphere.cpr.ContainerInitializer and for adding the path while initalizing the atmosphere framework
final AtmosphereFramework framework = AtmosphereFrameworkInitializer.newAtmosphereFramework(c, false, true);
// Hack to make jsr356 works. Pretty ugly.
DefaultAsyncSupportResolver resolver = new DefaultAsyncSupportResolver(framework.getAtmosphereConfig());
framework.getAtmosphereConfig().addInitParam(ApplicationConfig.JSR356_MAPPING_PATH,appropriateservletPath);
Upvotes: 0