【问题标题】:ServletContextListener isn't invoked when using com.sun.net.httpserver.HttpServer使用 com.sun.net.httpserver.HttpServer 时不调用 ServletContextListener
【发布时间】:2018-12-19 08:17:55
【问题描述】:

我在集成测试中使用com.sun.net.httpserver.HttpServer。它完成了它的工作,但我注意到ServletContextListener's 方法在测试期间没有被调用。 当我将应用程序部署到真正的 Tomcat 服务器时,我可以看到它的方法正在被调用。

下面是监听类:

package abc;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

@WebListener
public class StartupListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent event) {
        System.out.println("########################################");
    }

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        System.out.println("########################################");
    }
}

这是我在测试中启动HttpServer 的方式:

@BeforeClass
public static void startServer() {
    URI uri = UriBuilder.fromUri("http://localhost/").port(8080).build();

    // Create an HTTP server listening at port 8080
    try {
        server = HttpServer.create(new InetSocketAddress(uri.getPort()), 0);
    } catch (IOException e) {
        e.printStackTrace();
        fail();
    }

    // Create a handler wrapping the JAX-RS application
    HttpHandler handler = RuntimeDelegate.getInstance().createEndpoint(new ApplicationConfig(), HttpHandler.class);
    // Map JAX-RS handler to the server root
    server.createContext(uri.getPath(), handler);
    // Start the server
    server.start();
}

Maven 依赖:

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.0.1</version>
    <scope>provided</scope>
</dependency>

我删除了@WebListener 并插入了

metadata-complete="false"

<listener>
        <listener-class>abc.StartupListener</listener-class>
</listener>

web.xml 但没有帮助

有什么问题?有什么需要设置的吗?

【问题讨论】:

  • 我不确定是否以及如何使用此处使用的HttpServer 创建一个 servlet 容器。这不是 Jetty 的用例吗?
  • 您似乎认为com.sun.net.httpserver.HttpServer 是一个符合Servlet 的servlet 容器。不是。

标签: java tomcat servlets httpserver


【解决方案1】:

有什么问题?

HttpServer 不是 servlet 容器,不知道 servlet api。

有什么需要设置的吗?

You need to setup a servlet container 类似于 jetty,经常用于基于 Java 的 Web 应用程序的单元测试。

【讨论】:

  • 谢谢。不过我稍后会尝试,因为我已经创建了一个直接测试监听器类的单元测试。
  • 不客气。如果此问题已回答,请将其标记为已回答。如果您在为 JUnit 测试设置 sevlet 容器环境时遇到问题,请随时研究或就该主题提出新问题。
猜你喜欢
  • 2013-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-03
  • 2016-04-01
  • 2012-05-23
相关资源
最近更新 更多