2016-04-13 5 views
4

Ich habe eine Reihe von Controllern mit Request Mappings, die bestimmten URLs entsprechen. Ich möchte auch einen Controller, der mit jeder anderen URL übereinstimmt, die von den anderen Controllern nicht erreicht wird. Gibt es eine Möglichkeit, dies in Spring MVC zu tun? Könnte ich beispielsweise einen Controller mit @RequestMapping (value = "**") haben und die Reihenfolge ändern, in der Spring Controller verarbeitet werden, so dass dieser Controller zuletzt verarbeitet wird, um alle nicht übereinstimmenden Anfragen zu erfassen? Oder gibt es eine andere Möglichkeit, dieses Verhalten zu erreichen?Spring Controller für alle Anfragen, die nicht mit anderen Controllern übereinstimmen

+0

Wenn ich richtig verstehe, Sie alle 404s zu handhaben wollen? Aber möglicherweise etwas Nützliches tun, anstatt "nicht gefunden" zurückzukehren? – Leon

+0

Ja, Ihre Idee würde funktionieren. Hast du es versucht? Siehe https://github.com/stormpath/spring-mvc-rest-exhandler/blob/master/example/src/main/java/com/stormpath/blog/spring/mvc/rest/exhandler/DefaultController.java zum Beispiel – reto

+0

Ja, ich möchte eine Möglichkeit, URLs zu verarbeiten, die nicht mit anderen Controllern übereinstimmen, die ich erstellt habe. – rurounisuikoden

Antwort

6

Wenn Ihre Basis-URL so ist = http://localhost/myapp/ wo myapp Ihr ​​Kontext ist, dann wird myapp/a.html, myapp/b.html myapp/c.html der ersten 3 Methode im folgenden Controller zugeordnet. Aber alles andere wird die letzte Methode erreichen, die zu ** passt. Bitte beachten Sie, dass, wenn Sie die ** gemappte Methode an der Spitze Ihres Controllers platzieren, alle Anfragen diese Methode erreichen.

Dann ist dieser Controller servrs Ihre Anforderung:

@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"; 
} 
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); 
} 

Dies wird die Arbeit mit der richtigen Reihenfolge der Controller-Abgleich tun. Es wird verwendet, wenn nichts zusammenpasst.