在web.xml中添加侦听器类后获取错误503

时间:2014-04-03 12:41:41

标签: java spring jetty listener web.xml

我正在使用 Jetty 服务器,我想在服务器启动时进行一次检查。 为此我创建了一个监听器类,并将其条目放在web.xml中,如下所示:

听众类:

public class LicenseCheck extends ContextLoaderListener
{
    private static final Logger log = Logger.getLogger(LicenseCheck.class);

    public LicenseCheck()
    {
        log.info("Checking license");
    }
}

Web.xml中:

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
  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">


  <!-- spring context listener -->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        classpath:applicationContext.xml
    </param-value>
  </context-param>


  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

  <listener>
        <listener-class>com.license.LicenseCheck</listener-class>
    </listener>


   <!-- Index pages -->
   <welcome-file-list>
     <welcome-file>index.html</welcome-file>
   </welcome-file-list>

</web-app>

但是在添加这个之后,我的应用程序无法启动并抛出异常:

  

HTTP错误:503

     

访问/的问题。原因是:

      Service Unavailable 
     

由Jetty提供://

如果我从web.xml中删除了监听器的条目,它可以正常工作。

请为此提供解决方案。

2 个答案:

答案 0 :(得分:0)

我从日志中获得了解决方案:

日志说:

  

2014-04-03 18:50:41.969:WARN ::上下文启动失败   org.mortbay.jetty.webapp.WebAppContext@58afc4dd {/ SpringMVCRest,d:\工作区\ SpringMVCRest \的WebContent}   java.lang.IllegalStateException:无法初始化上下文,因为   已存在根应用程序上下文 - 检查是否   您的web.xml中有多个ContextLoader *定义!在   org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:265)     在   org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112)     在   org.mortbay.jetty.handler.ContextHandler.startContext(ContextHandler.java:549)     at org.mortbay.jetty.servlet.Context.startContext(Context.java:136)     在   org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1282)     在   org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:518)     在   org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:499)     在   org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)     在   org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)     在org.mortbay.jetty.Server.doStart(Server.java:224)at   org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)     在runjettyrun.Bootstrap.main(Bootstrap.java:97)2014-04-03   18:50:42.047:INFO ::已启动SelectChannelConnector@0.0.0.0:8080

所以我找到了2个解决方案:

  1. 删除我班级中ContextLoaderListener的继承。
  2. 保留继承并从web.xml
  3. 中删除ContextLoaderListener的条目

    两者都适合我。

答案 1 :(得分:0)

按照您在web.xml中指定的顺序调用侦听器。

    <listener>
        <listener-class>com.license.LicenseCheck</listener-class>
    </listener>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    public class LicenseCheck  implements   ServletContextListener {
        public void contextInitialized(ServletContextEvent event) {      
        /* This method is called when the servlet context is         
            initialized(web app is deployed/started).          
            You can initialize servlet context related data here.      
        */     
        //Write your logic to check license expiry  
        }    

        public void contextDestroyed(ServletContextEvent event) {      
            /* This method is invoked when the servlet context ( web app) is undeployed or server shuts down.      
            */                  
            //Do nothing
        }   
    }

这样,即使在ContextLoaderListener加载applicationContext之前,LicenseCheck也会首先执行并检查到期日期。