Java – Spring MVC: Controller RequestMapping working, but return always gives a 404


I have a couple of SYSOUTs in my controller's methods, and they appear in the console log… verifying for me that all of the @RequestMapping is behaving as expected. The @Autowiring of an environment bean is also working (is also correctly displayed by a SYSOUT).

However, the methods' returns (I am using methods that return String type) are only resulting in 404s. The *.jsps aren't found. Project is using Maven; IDE is eclipse kepler, FWIW.

My ViewResolver is bog-standard. Can't see the disconnect.

My web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns=""







My servlet.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns=""
xmlns:xsi="" xmlns:p=""
xmlns:aop="" xmlns:jee=""
xmlns:tx="" xmlns:util=""
xmlns:batch="" xmlns:task=""
xmlns:mvc="" xmlns:xjp=""

<context:component-scan base-package="com.corpabc.bluprint" />

<mvc:annotation-driven />
<mvc:resources mapping="/resources/**" location="/resources/" />

<import resource="classpath:corpabc/xjp/configuration/properties.xml" />

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />

<bean id="dataSourceDB2" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jdbc/BluPrint" />
<property name="resourceRef" value="true" />

<xjp:environment artifactId="${artifactId}" groupId="${groupId}" />


My Controller:

package com.corpabc.bluprint.controllers;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import corpabc.xjp.configuration.env.Environment;

 * Handles requests for the application.

public class BluPrintController {

    private Environment xjpEnvironment;

    protected String catchInit(Map<String, Object> model) {
        System.out.println("Got into init method.  XJP Environment: "+xjpEnvironment);
        model.put("xjp", this.xjpEnvironment);
        return "envtest";

    protected String catchAllOthers(Map<String, Object> model) {
        System.out.println("Got into catch-all method: ");
        return "defaultPage";

My envtest.jsp is under /WEB-INF/jsp/ … but entering URL ~localhost:8080/bluprint/init … I get a 404.

My defaultPage.jsp doesn't exist… I would expect a not found condition here, and that's what I get when I enter ~localhost:8080/bluprint/ . Not sure if it should be a 404, specifically, but that's what I get, in any case.

Best Solution

I suspect that you problem is in your servlet mapping. /* will force everything through your dispatcher servlet, including jsps. Try losing the *. I'll find the relevant part in the servlet spec and update....

From the servlet spec:

12.2 Specification of Mappings In the Web application deployment descriptor, the following syntax is used to define mappings: A string beginning with a ‘/’ character and ending with a ‘/*’ suffix is used for path mapping.

  • A string beginning with a ‘*.’ prefix is used as an extension mapping.

  • The empty string ("") is a special URL pattern that exactly maps to the application's context root, i.e., requests of the form . In this case the path info is ’/’ and the servlet path and context path is empty string (““).

  • A string containing only the ’/’ character indicates the "default" servlet of the application. In this case the servlet path is the request URI minus the context path and the path info is null.

  • All other strings are used for exact matches only.

So if you specify /* that overrides the *.jsp mapping, so jsp requests get routed back into your dispatcher servlet instead of hitting the jsp.