2012-05-24 19 views
10

Tengo un servlet que deseo implementar programáticamente utilizando Jetty. El servlet usa Spring y sus puntos web.xml en el archivo XML del contexto Spring como es de esperar.Despliegue de un servlet mediante programación con Jetty

Por el momento, sólo estoy tratando el código de ejemplo a partir de los documentos Jetty pero con mi propio 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(); 

Esto da lugar a la siguiente excepción:

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 

¿Cómo puedo configurar mi servlet para que Jetty sepa dónde están web.xml y Spring context?

¡Cualquier ayuda sería realmente apreciada!

EDITAR

Así que, al parecer, no necesito un web.xml pero hacer necesidad de señalar embarcadero a mi contexto primavera. He intentado algo lo siguiente:

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

Pero no funciona (sigue produciendo la misma excepción). También intenté configurar "contextConfigLocation" en ServletHolder en vano.

Respuesta

15

Para aquellos que estén interesados, me consiguió que esto funcione de la siguiente manera:

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

El paso clave que faltaba era

context.addEventListener(new ContextLoaderListener()); 

que carga el contexto Spring.

+0

en lugar de usar testContext.xml, podría haber usado 'context.setInitParameter (" contextConfigLocation ", AppConfig.class.getName());' –

0

si desea procesar un web.xml es necesario utilizar un WebappContext, un contexto servlet no sabe nada acerca de web.xml

véase: 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

Gracias por la respuesta. Sin embargo, ya sé cómo configurarlo para usar un WAR. Mi problema es que necesito poder depurar dentro del servlet. – DeadPassive

+0

si está configurado para usar una guerra, entonces no necesita usar el contexto de servlet como lo hizo en su ejemplo anterior ... por lo que no está claro qué es lo que realmente está buscando aquí, un servlet como lo ha definido _has_ no web.xml que es necesario conocer, tal vez lo que estás buscando es cómo obtener el contexto de primavera e insertarlo en tu servlet desde arriba ... –

+0

Nuevamente, no puedo usar una GUERRA porque eso significaría que mi servlet está compilado y no puedo depurarlo mientras se está ejecutando. Quizás tengas razón y el servlet solo necesita saber sobre el contexto de Spring. ¿Alguna idea de cómo puedo especificarlo? – DeadPassive

Cuestiones relacionadas