2012-05-24 100 views
10

我有一個我希望使用Jetty以編程方式部署的servlet。 servlet使用Spring,它的web.xml指向了你所期望的Spring上下文XML文件。用Jetty以編程方式部署servlet

目前,我只是從碼頭文檔,但我自己的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 [email protected]:8080 

我怎麼能設置我的servlet,以便Jetty知道它的web.xml和Spring上下文是哪裏?

任何幫助真的很感謝!

編輯

所以,顯然我並不需要一個web.xml,但我需要指向碼頭到我的Spring上下文。我試過以下幾種:

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

但它不起作用(仍產生相同的例外)。我也嘗試在ServletHolder上設置「contextConfigLocation」無濟於事。

回答

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

,如果你要處理,你需要使用一個WebappContext一個web.xml,一個servlet上下文不知道任何有關的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。我的問題是我需要能夠在servlet內部進行調試。 – DeadPassive

+0

如果您設置爲使用戰爭,那麼您不需要使用像上面示例中那樣的servlet上下文...所以它對我不清楚您實際在這裏尋找的是什麼,您已經定義了一個servlet _has_ no web.xml是需要知道的,也許你想要的是如何獲取spring context並從上面將它推入到你的servlet中。 –

+0

同樣,我不能使用WAR,因爲這意味着我的servlet會被編譯在運行時我無法在其中進行調試。也許你是對的,servlet只需要知道Spring的上下文。任何想法如何我可以指定它? – DeadPassive

相關問題