Развертывание сервлета программно с помощью Jetty
У меня есть сервлет, который я хочу развернуть программно с помощью Jetty. Сервлет использует Spring, и web.xml указывает на XML файл контекста Spring, как вы ожидали.
На данный момент я просто пытаюсь использовать код примера из документов Jetty, но с моим собственным сервлетом:
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 [email protected]:8080
Как я могу настроить свой сервлет так, чтобы Jetty знал, где это web.xml и Spring контекст?
Любая помощь будет действительно оценена!
ИЗМЕНИТЬ
Так что, по-видимому, мне не нужен web.xml, но мне do нужно указать Jetty в мой контекст Spring. Я пробовал что-то следующее:
context.setInitParameter("contextConfigLocation", "classpath*:**/*Context.xml");
Но он не работает (по-прежнему возникает одно и то же исключение). Я также попытался установить "contextConfigLocation" в ServletHolder безрезультатно.
Ответы
Ответ 1
Для тех, кто заинтересован, я получил это, чтобы работать следующим образом:
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.
Ответ 2
если вы хотите обработать файл web.xml, вам нужно использовать WebappContext, контекст сервлета ничего не знает о
для web.xml <
см. http://git.eclipse.org/c/jetty/org.eclipse.jetty.project.git/tree/example-jetty-embedded/src/main/java/org/eclipse/jetty/embedded/OneWebApp.java