Hi Les, Thanks for getting back to me. Your reply prompted me to dink around with this a bit more. I just created a stub ServletContextListener to see whether jetty calls "contextInitialized" again after it recreates the WebEnvironment during a reload and it appears that the ServletContextListener.contextDestroyed(ServletContextEvent) gets called, but that ServletContextListener.contextInitialized(ServletContextEvent) is not called again.
That being the case, I think it's safe to assume, for now, that this is a jetty issue and not a Shiro issue. I'll be sure to post any work around I find here in case someone else comes across this problem in the future. On Tue, Apr 16, 2013 at 7:24 PM, Les Hazlewood <[email protected]>wrote: > Hi Pete, > > Did you figure out what was happening here? > > Shiro's default web integration requires a WebEnvironment instance be > present in the ServletContext. This is referenced by the ShiroFilter at > runtime. It appears that the WebUtils.getRequiredWebEnvironment is not > finding the expected WebEnvironment instance. Perhaps Jetty is wiping out > the ServletContext and creating a new one without Shiro's knowledge? > > -- > Les Hazlewood | @lhazlewood > CTO, Stormpath | http://stormpath.com | @goStormpath | 888.391.5282 > > > On Tue, Mar 26, 2013 at 11:08 AM, Pete Poulos <[email protected]>wrote: > >> Hi, >> >> I'm not sure if this is a jetty issue or an issue with shiro, but I am >> trying to use the Jetty-Maven plugin for development and one of the >> key features I want is Jetty's hot redeployment when files are >> changed. However, Shiro is throwing the following exception when jetty >> attempts to reload the application and I am not certain what can be >> done to correct this. >> >> [Scanner-0] ERROR org.apache.shiro.web.servlet.AbstractFilter - Unable >> to start Filter: [No WebEnvironment found: no >> EnvironmentLoaderListener registered?]. >> java.lang.IllegalStateException: No WebEnvironment found: no >> EnvironmentLoaderListener registered? >> at >> org.apache.shiro.web.util.WebUtils.getRequiredWebEnvironment(WebUtils.java:276) >> at >> org.apache.shiro.web.servlet.ShiroFilter.init(ShiroFilter.java:73) >> at >> org.apache.shiro.web.servlet.AbstractShiroFilter.onFilterConfigSet(AbstractShiroFilter.java:152) >> at >> org.apache.shiro.web.servlet.AbstractFilter.init(AbstractFilter.java:97) >> at >> org.eclipse.jetty.servlet.FilterHolder.doStart(FilterHolder.java:123) >> at >> org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:69) >> at >> org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:732) >> at >> org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:279) >> at >> org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1314) >> at >> org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:722) >> at >> org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:492) >> at >> org.eclipse.jetty.maven.plugin.JettyWebAppContext.doStart(JettyWebAppContext.java:275) >> at >> org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:69) >> at >> org.eclipse.jetty.maven.plugin.JettyRunMojo.restartWebApp(JettyRunMojo.java:527) >> at >> org.eclipse.jetty.maven.plugin.JettyRunMojo$1.filesChanged(JettyRunMojo.java:481) >> at >> org.eclipse.jetty.util.Scanner.reportBulkChanges(Scanner.java:676) >> at >> org.eclipse.jetty.util.Scanner.reportDifferences(Scanner.java:539) >> at org.eclipse.jetty.util.Scanner.scan(Scanner.java:391) >> at org.eclipse.jetty.util.Scanner$1.run(Scanner.java:329) >> at java.util.TimerThread.mainLoop(Timer.java:555) >> at java.util.TimerThread.run(Timer.java:505) >> >> My web.xml looks like the following: >> >> <?xml version="1.0" ?> >> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" >> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >> xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee >> http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" >> version="2.4"> >> >> <!-- SHIRO CONFIGURATION >> ============================================== --> >> >> <listener> >> >> <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class> >> </listener> >> >> <filter> >> <filter-name>ShiroFilter</filter-name> >> >> <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class> >> </filter> >> >> <filter-mapping> >> <filter-name>ShiroFilter</filter-name> >> <url-pattern>/*</url-pattern> >> <dispatcher>REQUEST</dispatcher> >> <dispatcher>FORWARD</dispatcher> >> <dispatcher>INCLUDE</dispatcher> >> <dispatcher>ERROR</dispatcher> >> </filter-mapping> >> >> <!-- DATA SOURCE >> ====================================================== --> >> >> <resource-ref> >> <description>Account Data Source</description> >> <res-ref-name>jdbc/AccountDB</res-ref-name> >> <res-type>javax.sql.DataSource</res-type> >> <res-auth>Container</res-auth> >> </resource-ref> >> >> </web-app> >> >> >> And finally, here is the relevant portion of my maven pom file: >> >> >> <build> >> <plugins> >> <plugin> >> <groupId>org.eclipse.jetty</groupId> >> <artifactId>jetty-maven-plugin</artifactId> >> <version>9.0.0.RC2</version> >> <configuration> >> <jettyXml>src/jetty/jetty.xml</jettyXml> >> <scanIntervalSeconds>1</scanIntervalSeconds> >> <webApp> >> <contextPath>/</contextPath> >> >> <overrideDescriptor>src/jetty/override-web.xml</overrideDescriptor> >> </webApp> >> </configuration> >> <dependencies> >> <dependency> >> <groupId>mysql</groupId> >> >> <artifactId>mysql-connector-java</artifactId> >> <version>5.1.24</version> >> </dependency> >> </dependencies> >> </plugin> >> </plugins> >> > >
