Embedded Jetty in Spring MVC, IoC/DI
I was trying to configure embedded jetty in a spring application that implements MVC(Model View Controller). I want to utilize single spring applicationContext xml file for IoC(Inversion of Control) and DI(Dependency Injection) on dispatcher servlets.
The goal is to be able to use or reference beans configured/located on already been loaded spring application context. Read and understand my resolution below.
The goal is to be able to use or reference beans configured/located on already been loaded spring application context. Read and understand my resolution below.
This is what my main method look like:
LOG.info("Application starting");
_applicationContext = new ClassPathXmlApplicationContext(_resourceLocations);
_webServer = new Server();
SelectChannelConnector connector = new SelectChannelConnector();
connector.setHost("localhost");
connector.setPort(8080);
_webServer.addConnector(connector);
WebAppContext webAppContext = new WebAppContext(_webServer, "path to web app folder", "/");
GenericWebApplicationContext webApplicationContext = new GenericWebApplicationContext();
webApplicationContext.setServletContext(webAppContext.getServletContext());
webApplicationContext.setParent(_applicationContext);
webAppContext.getServletContext().setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, webApplicationContext);
webApplicationContext.refresh();
ServletHandler servletHandler = new ServletHandler();
ServletHolder servletHolder = new ServletHolder(new DispatcherServlet());
servletHolder.setName("dispatcher");
servletHandler.addServlet(servletHolder);
ServletMapping servletMapping = new ServletMapping();
servletMapping.setServletName(servletHolder.getName());
servletMapping.setPathSpec("*.htm");
servletHandler.addServletMapping(servletMapping);
webAppContext.setServletHandler(servletHandler);
_webServer.addHandler(webAppContext);
RequestLogHandler logHandler = new RequestLogHandler();
NCSARequestLog ncsaLog = new NCSARequestLog();
ncsaLog.setExtended(true);
ncsaLog.setFilename("logs/jetty-yyyy_mm_dd.log");
logHandler.setRequestLog(ncsaLog);
_webServer.addHandler(logHandler);
LOG.info("Starting main application context");
_applicationContext.start();
LOG.info("Starting Jetty Server");
try {
_webServer.start();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
LOG.info("Application started");
return null;
The idea is that DispatcherServlet's context is child context of GenericWebApplicationContext which in turn is a child of ClassPathXmlApplicationContext. Explicitly invoking setParent() gives you the access to all beans from the web application context.
Hope this helps. Feel free to leave your comment or suggestions.
Anonymous
November 21, 2011 at 7:14 AM
Thank you very much for this example.
I'm also trying to build a Spring MVC standalone application with embedded jetty. But I basically fail at the point, that the request somehow are not passed to the Spring Framework.
Jetty runs fine, and I also see that the Controllers from Spring are loaded and mapped.
I probabbly miss some configuration in the context file.
Could you give me some more informations (maybe sources) how your project structure looks and whats in your context files?
Have you also tried this with jetty 7 and Spring 3 ?
Thank you in advance,
Alig