Eric Sirianni created AS7-4722:
----------------------------------
Summary: META-INF/resources not available until after Servlet initialization
is complete
Key: AS7-4722
URL:
https://issues.jboss.org/browse/AS7-4722
Project: Application Server 7
Issue Type: Bug
Components: Web
Affects Versions: 7.1.1.Final
Environment: Generic
Reporter: Eric Sirianni
Assignee: Remy Maucherat
Using the new modular webapps facility in Servlet 3.0, I have a WAR that includes a
component JAR with a servlet definition:
{code:title=HelloServlet.java}
@WebServlet(value = "/HelloWorld", loadOnStartup = 1)
public class HelloServlet extends HttpServlet {
@Override
public void init() throws ServletException {
InputStream stream = getServletContext().getResourceAsStream("/foo.txt");
System.err.println("foo.txt stream: " + stream);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.getOutputStream().print("<h1>Hello World!</h1>");
}
}
{code}
The JAR also packages a resource inside META-INF/resources (as defined in section 4.6 of
the Servlet 3.0 spec)
{noformat}
$ jar -tf hello.jar
com/eric/HelloServlet.class
META-INF/resources/foo.txt
{noformat}
That JAR is incorporated into a WAR, which is then deployed in AS7:
{noformat}
$ jar -tf standalone/deployments/hello.war
WEB-INF/lib/hello.jar
{noformat}
The issue is with the ordering in which AS7 processes "overlays" (specifically
in org.apache.catalina.core.StandardContext.start()). The "overlay" is what
makes the META-INF resource available to the ServletContext. The overlays are added
*after* the servlets are initialized (via a listener to the COMPLETE_CONFIG_EVENT):
{code:title=StandardContext.java}
// Load and initialize all "load on startup" servlets
if (ok) {
loadOnStartup(findChildren());
}
if (ok) {
if (!listenerStart()) {
log.error( "Error listenerStart");
ok = false;
}
}
if (ok) {
// Notify our interested LifecycleListeners
lifecycle.fireLifecycleEvent(COMPLETE_CONFIG_EVENT, null);
}
{code}
Given this, the following behavior is observed:
*With loadOnStartup=-1* the stream for foo.txt is available
{noformat}
11:44:52,708 INFO [org.jboss.as.server.deployment] (MSC service thread 1-1) JBAS015876:
Starting deployment of "hello.war"
11:44:53,464 INFO [org.jboss.web] (MSC service thread 1-3) JBAS018210: Registering web
context: /hello
11:44:53,481 INFO [org.jboss.as] (MSC service thread 1-3) JBAS015951: Admin console
listening on
http://127.0.0.1:9990
11:44:53,496 INFO [org.jboss.as] (MSC service thread 1-3) JBAS015874: JBoss AS
7.1.1.Final "Brontes" started in 4611ms - Started 173 of 250 services (76
services are passive or on-demand)
11:44:53,588 INFO [org.jboss.as.server] (DeploymentScanner-threads - 2) JBAS018559:
Deployed "hello.war"
11:45:21,460 ERROR [stderr] (http--127.0.0.1-8080-1) foo.txt stream:
java.io.ByteArrayInputStream@13f0c45f
{noformat}
*With loadOnStartup=1* the stream for foo.txt is null
{noformat}
11:43:53,224 INFO [org.jboss.as.server.deployment] (MSC service thread 1-2) JBAS015876:
Starting deployment of "hello.war"
11:43:54,152 ERROR [stderr] (MSC service thread 1-3) foo.txt stream: null
11:43:54,174 INFO [org.jboss.web] (MSC service thread 1-3) JBAS018210: Registering web
context: /hello
11:43:54,189 INFO [org.jboss.as] (MSC service thread 1-4) JBAS015951: Admin console
listening on
http://127.0.0.1:9990
{noformat}
The expected behavior is that resources from overlays be made available prior to servlet
initialization for loadOnStartup servlets.
This is, of course, a toy example, but this presents serious issues when modularizing a
large scale web application.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:
https://issues.jboss.org/secure/ContactAdministrators!default.jspa
For more information on JIRA, see:
http://www.atlassian.com/software/jira