Deploying Spring Web Applicaiton To JBoss WebAppli

2019-08-27 17:03发布

问题:

When deploying a Spring Web Application to JBoss 7.1.1, gives the following Exception:

12:26:58,053 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/i]] (MSC service thread 1-3) Exception sending context initialized event to listener instance of class com.listener.IListener: java.lang.IllegalStateException: No WebApplicationContext found: no ContextLoaderListener registered?
at org.springframework.web.context.support.WebApplicationContextUtils.getRequiredWebApplicationContext(WebApplicationContextUtils.java:84) [spring-web-3.0.6.RELEASE.jar:3.0.6.RELEASE]
at com.listener.IListener.contextInitialized(IListener.java:28) [classes:]
at org.apache.catalina.core.StandardContext.contextListenerStart(StandardContext.java:3392) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.StandardContext.start(StandardContext.java:3850) [jbossweb-7.0.13.Final.jar:]
at org.jboss.as.web.deployment.WebDeploymentService.start(WebDeploymentService.java:90) [jboss-as-web-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) [rt.jar:1.6.0_26]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) [rt.jar:1.6.0_26]
at java.lang.Thread.run(Thread.java:662) [rt.jar:1.6.0_26]

12:26:58,115 ERROR [org.apache.catalina.core.StandardContext] (MSC service thread 1-3) Error listenerStart
12:26:58,115 ERROR [org.apache.catalina.core.StandardContext] (MSC service thread 1-3) Context [/i] startup failed due to previous errors
12:26:58,131 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-3) MSC00001: Failed to start service jboss.web.deployment.default-host./i: org.jboss.msc.service.StartException in service jboss.web.deployment.default-host./i: JBAS018040: Failed to start context
at org.jboss.as.web.deployment.WebDeploymentService.start(WebDeploymentService.java:95)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) [rt.jar:1.6.0_26]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) [rt.jar:1.6.0_26]
at java.lang.Thread.run(Thread.java:662) [rt.jar:1.6.0_26]

12:26:58,146 INFO  [org.jboss.as] (MSC service thread 1-7) JBAS015951: Admin console listening on http://127.0.0.1:9990
12:26:58,146 ERROR [org.jboss.as] (MSC service thread 1-7) JBAS015875: JBoss AS 7.1.1.Final "Brontes" started (with errors) in 4883ms - Started 225 of 304 services (2 services failed or missing dependencies, 76 services are passive or on-demand)
12:26:58,365 INFO  [org.jboss.as.server] (DeploymentScanner-threads - 2) JBAS015870: Deploy of deployment "webchannel.war" was rolled back with failure message {"JBAS014671: Failed services" => {"jboss.web.deployment.default-host./i" => "org.jboss.msc.service.StartException in service     jboss.web.deployment.default-host./i: JBAS018040: Failed to start context"}}
12:26:58,521 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-3) JBAS015877: Stopped deployment webchannel.war in 161ms
 12:26:58,521 INFO  [org.jboss.as.controller] (DeploymentScanner-threads - 2) JBAS014774: Service status report
JBAS014777:   Services which failed to start:      service jboss.web.deployment.default-host./i: org.jboss.msc.service.StartException in service jboss.web.deployment.default-host./i: JBAS018040: Failed to start context

   12:26:58,536 ERROR [org.jboss.as.server.deployment.scanner] (DeploymentScanner-threads - 1) {"JBAS014653: Composite operation failed and was rolled back. Steps that failed:" => {"Operation step-2" => {"JBAS014671: Failed services" => {"jboss.web.deployment.default-host./i" => "org.jboss.msc.service.StartException in service jboss.web.deployment.default-host./i: JBAS018040: Failed to start context"}}}}

I have a ServletContextListener called IListener. When I try to access the WebApplicationContext I receive the above Exception. However, this works in TomEE.

Below is the code:

public class IListener implements ServletContextListener {

public IListener() {

}

public void contextInitialized(ServletContextEvent event) {
    ServletContext context = event.getServletContext();
    WebApplicationContext webApplicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(context);
    }

public void contextDestroyed(ServletContextEvent event) {

}
  }

web.xml

<?xml version="1.0" encoding="UTF-8"?>

http://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd" version="2.5">

     <display-name>JEE WebApp</display-name>

     <context-param>
        <!-- Specifies the list of Spring Configuration files in comma separated format.-->
        <param-name>contextConfigLocation</param-name>
        <param-value>
        /WEB-INF/spring/services.xml</param-value>
     </context-param>

     <listener>
        <!-- Loads your Configuration Files-->
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        <listener-class>com.listener.IListener</listener-class>
     </listener>

     <servlet>
        <servlet-name>i</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
     </servlet>

     <servlet-mapping>
        <servlet-name>i</servlet-name>
        <url-pattern>/</url-pattern>
     </servlet-mapping>

     <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
     </welcome-file-list>    

Java version is 1.6 and Spring version 3.0.6.RELEASE.

I am not sure what to do.

回答1:

Usually, the ContextLoaderListener from Spring is good to go. If you don't have any specific requirements, just use that one. All-in-all, it should look like this:

 <listener>
    <!-- Loads your Configuration Files-->
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>

If you need to have a listener that uses the Spring context, you could consider extending this class. Make sure that the contextInitialized() method calls the super implementation first (so that it can initialize the Spring context for you). Afterwards, it will be available through (WebApplicationContext) servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE). Your contextDestroyed() method, however, should first do its own logic and finally call its super implementation.

Note, however, that this is not a very clean solution from the "seperation of concerns" point of view.

My recommendation would be, if possible, to use Spring filters, listeners or Interceptors. They are autowired automatically by Spring and you can use the full Spring power inside them.