尝试将嵌入式Tomcat 5迁移到嵌入式Tomcat 7.在启动时获取NPE。
我扩展了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)
以下是抛出异常的方法的tomcat 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中的新功能吗? 不确定需要配置什么来避免服务的这个空值。
答案 0 :(得分:0)
服务是将引擎与一个或多个连接器链接的对象。创建org.apache.catalina.core.StandardService
的默认实例并使用它。使用addConnector()
向其添加连接器,并使用addContainer()
将引擎添加到其中。