Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Running Spring MVC app with WebApplicationInitializer instead of web.xml does not work #184

Open
GoogleCodeExporter opened this issue Jul 7, 2015 · 0 comments

Comments

@GoogleCodeExporter
Copy link

What is the expected output? What do you see instead?

When using XML-based configuration (web.xml), controller methods work.

When using Java-based configuration (WebApplicationInitializer) for dynamic web 
app, controller methods are not executed.

Controller method breakpoints are not reached. Controller method mapped to root 
(http://localhost:8080/) returns directory listing (Directory: / ... WEB-INF/, 
resources/). Other controller methods (e.g., http://localhost:8080/users) 
return 404 Not Found.

I have tried both XmlWebApplicationContext (using original XML Spring MVC 
configuration) AnnotationConfigWebApplicationContext (Java-based Spring MVC 
configuration).

Request mappings show up in log correctly.

What steps will reproduce the problem?

1. Use WebApplicationInitializer instead of web.xml
2. Run/Debug using Run-Jetty-Run
3. Request URI in browser (http://localhost:8080/)
4. Breakpoint in controller not reached
5. Browser displays directory listing
6. Request URI in browser (http://localhost:8080/users)
7. Breakpoint in controller not reached
8. Browser displays 404 Not Found

What Eclipse version are you using ?

Kepler R2

What Run-Jetty-Run version are you using?

1.3.3

What OS are you using ? 32bit or 64 bit?

Max OS X 64 bit

Please provide any additional information below.

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app
  version="3.0"
  xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <!-- Define spring container -->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:/spring/root-context.xml</param-value>
  </context-param>

  <!-- Create spring container -->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

  <!-- Define servlet -->
  <servlet>
    <servlet-name>appServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:/spring/appServlet/servlet-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <!-- Map context root -->
  <servlet-mapping>
    <servlet-name>appServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

CustomWebApplicationInitializer (using XmlWebApplicationContext):

public class CustomWebApplicationInitializer implements 
WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        org.apache.log4j.BasicConfigurator.configure();

        XmlWebApplicationContext rootContext = new XmlWebApplicationContext();
        rootContext.setConfigLocation("classpath:/spring/root-context.xml");
        servletContext.addListener(new ContextLoaderListener(rootContext));

        ServletRegistration.Dynamic appServlet = servletContext.addServlet("appServlet", DispatcherServlet.class);
        appServlet.setInitParameter("contextConfigLocation", "classpath:/spring/appServlet/servlet-context.xml");
        appServlet.addMapping("/");
        appServlet.setLoadOnStartup(1);
    }
}

CustomWebApplicationInitializer (using AnnotationConfigWebApplicationContext):

public class CustomWebApplicationInitializer implements 
WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        org.apache.log4j.BasicConfigurator.configure();

        AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
        rootContext.register(RootContextConfig.class);
        servletContext.addListener(new ContextLoaderListener(rootContext));

        AnnotationConfigWebApplicationContext appServletContext = new AnnotationConfigWebApplicationContext();
        appServletContext.register(AppServletContextConfig.class);
        ServletRegistration.Dynamic appServlet = servletContext.addServlet("appServlet", new DispatcherServlet(appServletContext));
        appServlet.addMapping("/");
        appServlet.setLoadOnStartup(1);
    }
}

Controllers:

@Controller
public class PagesController {
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public @ResponseBody String home() {
        return "PagesController/home";
    }
}

@Controller
public class UsersController {
    @RequestMapping(value = "/users", method = RequestMethod.GET)
    public @ResponseBody String index() {
        return "UsersController/index";
    }
}

Log excerpt showing request mappings:

566 [main] INFO 
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMappi
ng  - Mapped 
"{[/],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" 
onto public java.lang.String apps.app_0.PagesController.home()
565 [main] INFO 
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMappi
ng  - Mapped 
"{[/users],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}
" onto public java.lang.String apps.app_0.UsersController.index()

Original issue reported on code.google.com by [email protected] on 12 May 2014 at 4:50

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant