PickBoy
PickBoy

Reputation: 1314

Spring MVC multiple url mapping to the same controller method

Let's say we have 3 url-patterns for a servlet named dispatcher in web.xml:

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/aaa/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/bbb/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/ccc/*</url-pattern>
</servlet-mapping>

and a controller method:

@RequestMapping(value = "/xxx", method = RequestMethod.POST)
public String foo() {}

Since the path value in @RequestMapping does not contain servlet path, when users request

/aaa/xxx
/bbb/xxx
/ccc/xxx

the requests will all be mapped to method foo.

I think this could cause potential problem if the web site is very complicated. Is it a flaw in Spring Web MVC or I misunderstand something?

Upvotes: 5

Views: 16505

Answers (2)

akarahman
akarahman

Reputation: 368

I had a situation where I cannot use /* mapping to dispatcher servlet, because I don't want all my requests of static resources to go to dispatcher servlet. So I used the below mapping to dispatcher servlet

<servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/spring/*</url-pattern>
</servlet-mapping>

and append the /spring to all your urls ex. http://localhost:8080/context/spring/common/get/currentuser

and your controller will look like below

@RestController

@RequestMapping("/common")

public class CommonController extends BaseController {

@RequestMapping(method = RequestMethod.GET,value="/get/currentuser")
public @ResponseBody User getUser() throws Exception  {
            // implementation ...

}


}


}

Upvotes: 0

Braj
Braj

Reputation: 46871

You can map all requests to one request mapping by passing multiple value.

@RequestMapping(value = {"/aaa/xxx", "/bbb/xxx", "/ccc/xxx"}, method = RequestMethod.POST)
public String foo() {}

and just change mapping in web.xml to handle all type of request to dispatcher servlet.

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

You can define different controllers based on application requirement or web flow. You can move common piece of code in utility classes if needed.

@RequestMapping("/aaa")
public class AAAController {
    @RequestMapping(value = "/xxx", method = RequestMethod.POST)
    public String foo() {
        // call to common utility function
    }
    // other methods
}

@RequestMapping("/bbb")
public class BBBController {
    @RequestMapping(value = "/xxx", method = RequestMethod.POST)
    public String foo() {
        // call to common utility function
    }
    // other methods
}

@RequestMapping("/ccc")
public class CCCController {
    @RequestMapping(value = "/xxx", method = RequestMethod.POST)
    public String foo() {
        // call to common utility function
    }
    // other methods
}

Read more in Spring Web MVC framework documentation

You can configure it programatically as well

public class MyWebApplicationInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext container) {
        ServletRegistration.Dynamic registration = container.addServlet("dispatcher", new DispatcherServlet());
        registration.setLoadOnStartup(1);
        registration.addMapping("/*");
    }
}

Upvotes: 9

Related Questions