Spring Controller to handle all requests not matched by other Controllers

20,645

Solution 1

If your base url is like that= http://localhost/myapp/ where myapp is your context then myapp/a.html, myapp/b.html myapp/c.html will get mapped to the first 3 method in the following controller. But anything else will reach the last method which matches **. Please note that , if you put ** mapped method at the top of your controller then all request will reach this method.

Then this controller servrs your requirement:

@Controller
@RequestMapping("/")
public class ImportController{

    @RequestMapping(value = "a.html", method = RequestMethod.GET)
    public ModelAndView getA(HttpServletRequest req) {
        ModelAndView mv;
        mv = new ModelAndView("a");
        return mv;
    }

    @RequestMapping(value = "b.html", method = RequestMethod.GET)
    public ModelAndView getB(HttpServletRequest req) {
        ModelAndView mv;
        mv = new ModelAndView("b");
        return mv;
    }

    @RequestMapping(value = "c.html", method = RequestMethod.GET)
    public ModelAndView getC(HttpServletRequest req) {
        ModelAndView mv;
        mv = new ModelAndView("c");
        return mv;
    }

@RequestMapping(value="**",method = RequestMethod.GET)
public String getAnythingelse(){
return "redirect:/404.html";
}

Solution 2

@RequestMapping (value = "/**", method = {RequestMethod.GET, RequestMethod.POST})
public ResponseEntity<String> defaultPath() {
    LOGGER.info("Unmapped request handling!");
    return new ResponseEntity<String>("Unmapped request", HttpStatus.OK);
}

This will do the work with proper order of controller matching. It will be used when nothing is matched.

Share:
20,645
rurounisuikoden
Author by

rurounisuikoden

Updated on February 21, 2021

Comments

  • rurounisuikoden
    rurounisuikoden about 3 years

    I have a series of Controllers with Request Mappings that match certain URL's. I also want a Controller that will match any other URL not matched by the other Controllers. Is there a way to do this in Spring MVC? For example, could i have a controller with @RequestMapping(value="**") and change the order in which Spring Controllers are processed so this Controller is processed last to catch all unmatched requests? Or is there another way to achieve this behaviour?

    • Leon
      Leon about 8 years
      If I understand correctly, you want to handle all 404s? But possibly do something useful, rather than return 'not found'?
    • reto
      reto about 8 years
      Yes your idea would work. Have you tried it? See github.com/stormpath/spring-mvc-rest-exhandler/blob/master/… for example
    • rurounisuikoden
      rurounisuikoden about 8 years
      Yes, i want a way to process URL's not matched by any other Controller i have made.
    • rurounisuikoden
      rurounisuikoden about 8 years
      Wouldn't the default controller you have provided in that link be matched before other requestMappings?
    • Kanagavelu Sugumar
      Kanagavelu Sugumar almost 6 years
  • Kanagavelu Sugumar
    Kanagavelu Sugumar almost 6 years
    After this configuration my swagger stopped working. github.com/springfox/springfox/issues/2532
  • Mustofa Rizwan
    Mustofa Rizwan almost 6 years
    use @RequestMapping("/anything/") instead of @RequestMapping("/") for this configuraration
  • Kanagavelu Sugumar
    Kanagavelu Sugumar almost 6 years
    But that will handle only non mapped requests under /anything
  • Mustofa Rizwan
    Mustofa Rizwan almost 6 years
    then remove the last method from this class value="**", and use custom exception handler... which will make sure that any non mapped request goes to a certain 404 page
  • Kanagavelu Sugumar
    Kanagavelu Sugumar almost 6 years
    Exception handler wont solve my problem, want to handle it inside @RequestMapping method. Anyhow Thanks & plus1.
  • manash
    manash over 5 years
    This is problematic. For some reason, this controller method catches request to static resources too.