2012-05-24 3 views
10

У меня есть сервлет, который я хочу развернуть программно с помощью Jetty. Сервлет использует Spring, и web.xml указывает на XML-файл Spring, как и следовало ожидать.Развертывание сервлета программно с помощью Jetty

На данный момент, я просто пытаюсь пример кода от 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?

Любая помощь действительно оценена!

EDIT

Так что, видимо, я не нуждаюсь в web.xml, но я сделать нужно указать Пристань моей весны контекст. Я пробовал что-то следующее:

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

Но он не работает (по-прежнему производит то же исключение). Я также попытался установить «contextConfigLocation» в ServletHolder безрезультатно.

ответ

15

Для тех, кто заинтересован, я получил эту работу следующим образом:

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.

+0

вместо использования testContext.xml вы могли бы использовать 'context.setInitParameter (" contextConfigLocation ", AppConfig.class.getName());' –

0

если вы хотите обработать 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

+0

Спасибо за ответ. Однако я уже знаю, как настроить его для использования WAR. Моя проблема в том, что мне нужно иметь возможность отлаживать внутри сервлета. – DeadPassive

+0

Если вы настроены на использование войны, вам не нужно использовать контекст сервлета, как у вас в вашем примере выше ... так что его непонятно, что вы на самом деле ищете здесь, сервлет, как вы определили _has_ no web.xml, о котором нужно знать, возможно, что вы ищете, как получить контекст весны и вставить его в свой сервлет сверху. –

+0

Опять же, я не могу использовать WAR, потому что это будет означать, что мой сервлет скомпилирован и я не могу отлаживать его, пока он работает. Возможно, вы правы, и сервлет просто должен знать о контексте Spring. Любая идея, как я могу это указать? – DeadPassive

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