Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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="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_2_5.xsd">

<display-name>BluPrint</display-name>

<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>

<context-param>
<param-name>groupId</param-name>
<param-value>${project.groupId}</param-value>
</context-param>

<context-param>
<param-name>artifactId</param-name>
<param-value>${project.artifactId}</param-value>
</context-param>

</web-app>

My servlet.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util"
xmlns:batch="http://www.springframework.org/schema/batch" xmlns:task="http://www.springframework.org/schema/task"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xjp="http://www.corpabc.com/schema/xjp"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd
http://www.corpabc.com/schema/xjp http://www.corpabc.com/schema/xjp/beans.xsd">

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

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

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

</beans>

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.
 */

@Controller
@RequestMapping("/*")
public class BluPrintController {

    @Autowired
    private Environment xjpEnvironment;

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

    @RequestMapping("/*")
    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.

like image 232
David Neuschulz Avatar asked Oct 23 '13 16:10

David Neuschulz


People also ask

Why does Spring MVC have 404 error?

As with any web application or website, Spring MVC returns the HTTP 404 response code when the requested resource can't be found.

What is true about @RequestMapping annotation in Spring MVC?

The @RequestMapping annotation can be applied to class-level and/or method-level in a controller. The class-level annotation maps a specific request path or pattern onto a controller. You can then apply additional method-level annotations to make mappings more specific to handler methods.

What will happen if handler methods @RequestMapping?

Using @RequestMapping With HTTP Methods In the code snippet above, the method element of the @RequestMapping annotations indicates the HTTP method type of the HTTP request. All the handler methods will handle requests coming to the same URL ( /home), but will depend on the HTTP method being used.

What is the difference between GetMapping and RequestMapping?

@RequestMapping is used at the class level while @GetMapping is used to connect the methods. This is also an important Spring MVC interview question to knowing how and when to use both RequestMapping and GetMapping is crucial for Java developers.


1 Answers

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.

like image 178
Aaron Avatar answered Oct 18 '22 04:10

Aaron