2012-05-24 11 views
10

Ho un servlet che desidero distribuire a livello di programmazione utilizzando Jetty. Il servlet usa Spring ed è web.xml punta al file XML del contesto Spring come ci si aspetterebbe.Distribuzione di un servlet a livello di codice con Jetty

Al momento, sto solo cercando il codice di esempio dalla documentazione Jetty, ma con la mia 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(); 

Il risultato è il seguente eccezione:

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 

Come posso imposta il mio servlet in modo che Jetty sappia dove si trova web.xml e contesto Spring?

Qualsiasi aiuto sarebbe davvero apprezzato!

EDIT

Quindi, a quanto pare non ho bisogno di un web.xml ma fare bisogno di puntare Jetty al mio contesto primavera. Ho provato qualcosa del seguente:

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

Ma non funziona (produce ancora la stessa eccezione). Ho anche provato a impostare "contextConfigLocation" su ServletHolder senza alcun risultato.

risposta

15

Per coloro che sono interessati, ho ottenuto questo lavoro nel modo seguente:

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(); 

Il passaggio chiave che mi mancava era

context.addEventListener(new ContextLoaderListener()); 

che carica il contesto Spring.

+0

invece di usare testContext.xml potresti aver usato 'context.setInitParameter (" contextConfigLocation ", AppConfig.class.getName());' –

0

se si desidera elaborare un web.xml è necessario utilizzare un WebappContext, un contesto servlet non sa nulla di web.xml

vedi: 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

Grazie per la risposta. Tuttavia, so già come configurarlo per utilizzare un WAR. Il mio problema è che ho bisogno di essere in grado di eseguire il debug all'interno del servlet. – DeadPassive

+0

se sei configurato per usare una guerra, non hai bisogno di usare il contesto servlet come hai nell'esempio sopra ... quindi non mi è chiaro cosa stai cercando in questo caso, un servlet come hai definito _has_ no web.xml che è necessario conoscere, forse quello che stai cercando è come ottenere il contesto primaverile e spingerlo nel tuo servlet da sopra .. –

+0

Ancora, non posso usare un WAR perché questo significherebbe che il mio servlet è compilato e non posso eseguire il debug all'interno mentre è in esecuzione. Forse hai ragione e il servlet deve solo conoscere il contesto di primavera. Qualche idea su come posso specificarlo? – DeadPassive

Problemi correlati