spring - 使用 Jetty 以编程方式部署 servlet

标签 spring servlets jetty context.xml

我有一个 servlet,我希望使用 Jetty 以编程方式部署它。 servlet 使用 Spring,它的 web.xml 指向 Spring 上下文 XML 文件,正如您所期望的那样。

目前,我只是尝试使用 Jetty 文档中的示例代码,但使用的是我自己的 servlet:

Server server = new Server(8080);

ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/");
server.setHandler(context);

context.addServlet(new ServletHolder(new BatchReceiver()),"/br/*");

server.start();
server.join();

这会导致以下异常:

2012-05-24 14:43:20.190:INFO:oejs.Server:jetty-8.1.3.v20120416
2012-05-24 14:43:20.266:WARN:/:unavailable
java.lang.IllegalStateException: No WebApplicationContext found: no ContextLoaderListener registered?
at org.springframework.web.context.support.WebApplicationContextUtils.getRequiredWebApplicationContext(WebApplicationContextUtils.java:84)
at com.spiffymap.sealog.server.servlet.BatchReceiver.init(BatchReceiver.java:126)
at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:492)
at org.eclipse.jetty.servlet.ServletHolder.doStart(ServletHolder.java:312)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:778)
at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:258)
at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:699)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
at org.eclipse.jetty.server.handler.HandlerWrapper.doStart(HandlerWrapper.java:90)
at org.eclipse.jetty.server.Server.doStart(Server.java:262)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
at com.spiffymap.sealog.server.servlet.TestBatchReceiver.main(TestBatchReceiver.java:26)
2012-05-24 14:43:20.335:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:8080

如何设置我的 servlet 以便 Jetty 知道它的 web.xml 和 Spring 上下文在哪里?

任何帮助将不胜感激!

编辑

所以,显然我不需要 web.xml,但我确实需要将 Jetty 指向我的 Spring 上下文。我尝试过类似以下的方法:

context.setInitParameter("contextConfigLocation", "classpath*:**/*Context.xml");

但它不起作用(仍然产生相同的异常)。我也尝试在 ServletHolder 上设置“contextConfigLocation”无济于事。

最佳答案

对于那些有兴趣的人,我得到了如下工作:

Server server = new Server(8090);

ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/batch");

// Setup Spring context
context.addEventListener(new ContextLoaderListener());
context.setInitParameter("contextConfigLocation", "classpath*:**/testContext.xml");

server.setHandler(context);

// Add servlets
context.addServlet(new ServletHolder(new BatchReceiver()), "/receiver/*");
context.addServlet(new ServletHolder(new BatchSender()), "/sender/*");       

server.start();
server.join();

我缺少的关键步骤是

context.addEventListener(new ContextLoaderListener());

加载 Spring 上下文。

关于spring - 使用 Jetty 以编程方式部署 servlet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10738816/

相关文章:

java - 无法使用 Spring Security 执行

java - 关于在下面的应用程序中添加 spring jmx 功能

spring - 为什么 Spring JPA 将有效日期转换为无法识别的格式化字符串?

spring - 使用外部属性文件配置的表名

java - 在哪里复制 apache tomcat 服务器中的 servlet 文件才能与 Web 正常工作?

java - 在 request.getAttribute 上获取 null 值

java - <%@page session ="false"%> 时访问 JSTL 中的 session 范围变量

mysql - 运行 spring 应用程序的 Jetty Docker 容器无法连接到在 docker 容器外运行的 mysql

java - 嵌入式 Jetty,在给定时间后终止请求

servlets - 用于开发的最干净的 Jetty 配置?