3

I have a spring application and I can't solve a problem. When I use a PathVariable, the value in my RequestMapping is getting added to the URI and the DispatchHandler is getting confused.

For example, when I request /Dashboard/project/1131/

I get HTTP Status 404 - /Dashboard/project/1131/WEB-INF/jsp/projectDetail.jsp

The project/1131 gets added into the path for some reason

When I request /Dashboard/projects Spring finds my .jsp and presents it. /project/{projectId} doesn't work - I get the behavior described above.

Here's my controller

@Controller
public class ProjectController {

protected final Log logger = LogFactory.getLog(getClass());

@RequestMapping(value = "projects", method=RequestMethod.GET)
public String projects() {
    return "/projects";
}

@RequestMapping(value="/project/{projectId}", method=RequestMethod.GET)
public String project(@PathVariable("projectId") String projectId, ModelMap map) {
    map.put("projectId", projectId);
    logger.info("Project Id: " + projectId);
    return "/projectDetail";
}

}

My configuration

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">

<!-- Webapp name -->
<display-name>Dashboard</display-name>

<!-- default file name -->
<welcome-file-list>
    <welcome-file>home</welcome-file>
</welcome-file-list>

<!-- spring listener (all spring jars need to be in WEB-INF/lib -->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!-- set servlet to DispatcherService -->
<servlet>
    <servlet-name>dashboard</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<!-- hand all requests to dispatcher service -->
<servlet-mapping>
    <servlet-name>dashboard</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

</web-app>

AppConfig

@Configuration
public class AppConfig {

@Bean
ViewResolver viewResolver() {
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    resolver.setPrefix("WEB-INF/jsp/");
    resolver.setSuffix(".jsp");
    return resolver;
}

}

dashboard-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:mvc="http://www.springframework.org/schema/mvc" 
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<!-- the packages to scan for annotations -->
<context:component-scan base-package="com.dennisstevens.dashboard.controller" />
<context:component-scan base-package="com.dennisstevens.dashboard" />
<context:component-scan base-package="com.dennisstevens.dashboard.domain" />

<!-- Tell Spring that MVC components are @Annotation Driven -->
<mvc:annotation-driven />

<!-- Tell Spring Dispatch Handler to look in WebContent/resources/ for resources -->
<mvc:resources mapping="/resources/**" location="/resources/" />

<!-- Tell Spring to scan for config annotations -->
<context:annotation-config/>

<!--  TODO: Figure out how to load this in AppConfig -->
<bean id="messageSource"
    class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basename" value="messages" />
</bean>

</beans>

This has to be simple - but I have looked through the documentation and searched the internet for hours. It looks like I am doing everything right from what I can see.

2
  • Unrelated, but why use a 2.5 schema with a 3.0 app? Commented Nov 30, 2012 at 2:25
  • Thanks. I started with a 2.5 example and didn't clean up that reference. I will clean that up. Commented Dec 1, 2012 at 15:43

1 Answer 1

3

I think having a leading slash in resolver.setPrefix("/WEB-INF/jsp/"); should fix it for you.

Sign up to request clarification or add additional context in comments.

2 Comments

Except I am not finding resources now either. No mapping found for HTTP request with URI [/Dashboard/projects/resources/js/jquery/jquery-1.8.3.min.js] in DispatcherServlet with name 'dashboard'. In this case, I do have the leading slash in front of resources.
I fixed that too. I have to use c:url to make absolute paths. <script src="<c:url value = "/resources/js/jquery/jquery-1.8.3.min.js" />">

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.