Spring Controller's URL request mapping not working as expected
Solution 1
You need to use @RequestMapping(value="/us", method=RequestMethod.GET)
or you need to request about/about/us
Solution 2
Since you have mapped "/about" in your web.xml, the url it will pass will be like this www.xyz.com/about/*
As your configuration says it will work for
- www.xyz.com/about/about/us
- www.xyz.com/about/about
In order to to work properly either use
/*
in web.xml instead of /about
or change the controller's endpoint to
@RequestMapping(value="/us", method=RequestMethod.GET)
@RequestMapping(value="/", method=RequestMethod.GET)
Atharva
Updated on January 15, 2020Comments
-
Atharva over 4 years
I have created a mapping in web.xml something like this:
<servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/about/*</url-pattern> </servlet-mapping>
In my controller I have something like this:
import org.springframework.stereotype.Controller; @Controller public class MyController{ @RequestMapping(value="/about/us", method=RequestMethod.GET) public ModelAndView myMethod1(ModelMap model){ //some code return new ModelAndView("aboutus1.jsp",model); } @RequestMapping(value="/about", method=RequestMethod.GET) public ModelAndView myMethod2(ModelMap model){ //some code return new ModelAndView("aboutus2.jsp",model); } }
And my dispatcher-servlet.xml has view resolver like:
<mvc:annotation-driven/> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:viewClass="org.springframework.web.servlet.view.JstlView" p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"/>
To my surprise: request
.../about/us
is not reaching to myMethod1 in the controller. The browser shows 404 error. I put a logger inside the method but it isn't printing anything, meaning, its not being executed.
.../about
works fine! What can be the done to make.../about/us
request work? Any suggestions? -
Atharva almost 12 yearsBut I haven't mapped any thing on the controller class level. Do I need to ? I think only then I need to writer
/us
instead of/about/us
and have a look:/about
is already working ! Then why notabout/us
. -
Ravi Khakhkhar almost 12 yearsThe reason : You have mapped /about/ in web.xml to DispatcherServlet. So, you need to map only part following /about.
-
Ravi Khakhkhar almost 12 yearsDo /about coming into your method ?? Really?? It must be coming into DispatcherServlet
-
Atharva almost 12 yearsIt's leading to the method through the dispatcher servlet. By the way I got the code working by adding few more config lines in the dispatcher-servlet.xml. Take a look at my answer. Thanks for your help. :)
-
Ravi Khakhkhar almost 12 yearsCongratulations.!!! But, I have different view on this. I don't see any reason why I need to use alwaysUseFullPath, as long as I can map only later part of the request URLs for Spring. At least I don't need to repeat /about everywhere.
-
Atharva almost 12 yearsWell I added them after trying out all cases possible in mapping. I think I need to understand when do we use alwaysUseFullPath. I just added it by seeing similar thing in some other post.
-
Ravi Khakhkhar almost 12 years
-
Atharva almost 12 yearsOkay I understood it. I would prefer to use alwaysUseFullPath option as it makes the things explicit in the RequestMappings in the controller methods. This is especially when dispatcher servlet mappings are very much generic and bound to many url-patterns. BTW, you don't need to write
about
everywhere in the methods. Just annotating it once over the class is enough. And in the inside methods we can just use relative url patterns like/us
. -
Ravi Khakhkhar almost 12 yearsLater on, you will realize that this is not the standard.And at least I have to repeat it on every class :P