2013-11-19 2 views
0

Попытка миграции встроенного Tomcat 5 в встроенный Tomcat 7. Получение NPE во время запуска.migrate embedded tomcat 5 to tomcat 7

Я расширяю класс Embedded и выполняю всю предлагаемую инициализацию в правильной последовательности.

NPE происходит здесь:

Caused by: java.lang.NullPointerException 
    at org.apache.catalina.core.ApplicationContext.populateSessionTrackingModes(ApplicationContext.java:1187) 
    at org.apache.catalina.core.ApplicationContext.<init>(ApplicationContext.java:126) 
    at org.apache.catalina.core.StandardContext.getServletContext(StandardContext.java:2344) 
    at org.apache.catalina.core.StandardContext.postWorkDirectory(StandardContext.java:6283) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5251) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 

Вот источник кот 7 для метода метания исключение:

private void populateSessionTrackingModes() { 
    // URL re-writing is always enabled by default 
    defaultSessionTrackingModes = EnumSet.of(SessionTrackingMode.URL); 
    supportedSessionTrackingModes = EnumSet.of(SessionTrackingMode.URL); 

    if (context.getCookies()) { 
     defaultSessionTrackingModes.add(SessionTrackingMode.COOKIE); 
     supportedSessionTrackingModes.add(SessionTrackingMode.COOKIE); 
    } 

    // SSL not enabled by default as it can only used on its own 
    // Context > Host > Engine > Service 
    Service s = ((Engine) context.getParent().getParent()).getService(); 
    Connector[] connectors = s.findConnectors(); 
    // Need at least one SSL enabled connector to use the SSL session ID. 
    for (Connector connector : connectors) { 
     if (Boolean.TRUE.equals(connector.getAttribute("SSLEnabled"))) { 
      supportedSessionTrackingModes.add(SessionTrackingMode.SSL); 
      break; 
     } 
    } 
} 

Проблема здесь происходит:

Service s = ((Engine) context.getParent().getParent()).getService(); 

Служба переменная s равна нулю. Похоже, что объект сервиса должен быть установлен в классе Engine.

Это что-то новое в Tomcat 7? Не уверен, что нужно настроить, чтобы избежать этого значения null для службы.

+0

Какая линия 1187? Это 'Сервис s = ((Engine) context.getParent(). GetParent()). GetService();' или 'Connector [] connector = s.findConnectors();'? – dcsohl

+0

s.findConnectors() - строка 1187. Переменная установлена ​​в значение null в строке 1186, а затем используется в 1187, которая вызывает NPE. – user2040457

ответ

0

Служба - это объект, который связывает двигатель с одним или несколькими разъемами. Создайте экземпляр по умолчанию org.apache.catalina.core.StandardService и используйте его. Добавьте к нему разъемы с addConnector() и добавьте Двигатель к нему с addContainer().

+0

Благодарим за отзыв. В javadoc для класса Embedded перечислены действия и последовательность действий, которые необходимо выполнить. Он не упоминает о создании и добавлении класса Service. Вы говорите, что документация неверна? Плюс, Embedded, класс, который я расширяю, уже расширяет StandardService. Мне еще нужно создать еще один? – user2040457

+0

Я не использую класс Embedded - я использую новый класс Tomcat. Похоже, класс Embedded требует нескольких настроек (или документы должны быть обновлены). Вы должны иметь возможность вызвать setService() в экземпляре Engine, передав экземпляр Embedded. –

Смежные вопросы