Получаване на грешка 503 след добавяне на клас слушател в 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, той работи добре.

Моля, дайте решение за това.


person Chintan Patel    schedule 03.04.2014    source източник
comment
Джети има трупи. Вероятно ще изяснят какво не е наред.   -  person bmargulies    schedule 03.04.2014


Отговори (2)


Получих решенията от дневника:

Дневникът казва:

2014-04-03 18:50:41.969:WARN::Неуспешно стартиране на контекст org.mortbay.jetty.webapp.WebAppContext@58afc4dd{/SpringMVCRest,D:\Workspace\SpringMVCRest\WebContent} java.lang.IllegalStateException: Не може да се инициализира контекст, тъй като вече има контекст на основно приложение - проверете дали имате множество дефиниции на ContextLoader* във вашия web.xml! в 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) в 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) в org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java :50) в runjettyrun.Bootstrap.main(Bootstrap.java:97) 2014-04-03 18:50:42.047:INFO::Started [email protected]:8080

Така че намерих 2 решения:

  1. Премахнете наследството на ContextLoaderListener в моя клас.
  2. Запазете наследството и премахнете записа на ContextLoaderListener от web.xml

И двете работиха за мен.

person Chintan Patel    schedule 03.04.2014

Слушателите се извикват в реда, който сте посочили в 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
        }   
    }

По този начин LicenseCheck ще се изпълни първо и ще провери изтичането дори преди applicationContext да бъде зареден от ContextLoaderListener.

person Prasad    schedule 03.04.2014