2011-10-20 16 views
9

Mam następujące odwzorowanie:opcjonalne zmienne ścieżki w Spring-MVC RequestMapping URITemplate

@RequestMapping(value = "/{first}/**/{last}", method = RequestMethod.GET) 
public String test(@PathVariable("first") String first, @PathVariable("last") 
    String last) {} 

Które z następujących URI:

foo/a/b/c/d/e/f/g/h/bar 
foo/a/bar 
foo/bar 

mapuje foo do pierwszy i bar do ostatni i działa dobrze.

Co chciałbym to coś, co odwzorowuje wszystko między foo i bar w jednym param ścieżki lub null, jeśli nie ma w srodku (jak w ostatnim przykładzie URI):

@RequestMapping(value = "/{first}/{middle:[some regex here?]}/{last}", 
    method = RequestMethod.GET) 
public String test(@PathVariable("first") String first, @PathVariable("middle") 
    String middle, @PathVariable("last") String last) {} 

Dość zatrzymany na regex, ponieważ miałem nadzieję, że coś prostego, jak {middle:. *}, które tylko mapuje do/foo/a/bar, lub {middle: (. * /) *}, które wydaje się mapować na nic.

Czy AntPathStringMatcher tokenizuje na "/" przed zastosowaniem wzorów regex? (tworzenie wzorców, które przekraczają/niemożliwe) lub czy istnieje rozwiązanie?

FYI to w Spring 3.1M2

to wydawać podobne do @RequestMapping controllers and dynamic URLs ale nie widzę tam rozwiązania.

Odpowiedz

1

Nie można zrobić, o ile wiem. Tak jak powiedziałeś, wyrażenie regularne jest stosowane do elementu ścieżki po podzieleniu ścieżki w każdym ukośniku, więc wyrażenie regularne nigdy nie może się równać "/".

Można ręcznie sprawdzić adres URL i przeanalizować go samodzielnie z obiektu żądania.

1

Można to zrobić, pisząc niestandardowy matcher ścieżki i konfigurując Spring, aby z niego korzystać. Na przykład, takie rozwiązanie jest udokumentowane tutaj: http://java.dzone.com/articles/spring-3-webmvc-optional-path

Łącze zapewnia niestandardową ścieżkę matcher i pokazuje, jak skonfigurować sprężynę, aby go użyć. To powinno rozwiązać twoją potrzebę, jeśli nie masz nic przeciwko pisaniu komponentu niestandardowego.

Poza tym jest duplikatem With Spring 3.0, can I make an optional path variable?

13

w moim projekcie używam zmienną wewnętrzną w Spring Framework:

@RequestMapping(value = { "/trip/", // /trip/ 
     "/trip/{tab:doa|poa}/",// /trip/doa/,/trip/poa/ 
     "/trip/page{page:\\d+}/",// /trip/page1/ 
     "/trip/{tab:doa|poa}/page{page:\\d+}/",// /trip/doa/page1/,/trip/poa/page1/ 
     "/trip/{tab:trip|doa|poa}-place-{location}/",// /trip/trip-place-beijing/,/trip/doa-place-shanghai/,/trip/poa-place-newyork/, 
     "/trip/{tab:trip|doa|poa}-place-{location}/page{page:\\d+}/"// /trip/trip-place-beijing/page1/ 
}, method = RequestMethod.GET) 
public String tripPark(Model model, HttpServletRequest request) throws Exception { 
    int page = 1; 
    String location = ""; 
    String tab = "trip"; 
    // 
    Map pathVariables = (Map) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE); 
    if (pathVariables != null) { 
     if (pathVariables.containsKey("page")) { 
      page = NumberUtils.toInt("" + pathVariables.get("page"), page); 
     } 
     if (pathVariables.containsKey("tab")) { 
      tab = "" + pathVariables.get("tab"); 
     } 
     if (pathVariables.containsKey("location")) { 
      location = "" + pathVariables.get("location"); 
     } 
    } 
    page = Math.max(1, Math.min(50, page)); 
    final int pagesize = "poa".equals(tab) ? 40 : 30; 
    return _processTripPark(location, tab, pagesize, page, model, request); 
} 

Zobacz HandlerMapping.html#URI_TEMPLATE_VARIABLES_ATTRIBUTE

-1

Spróbuj skorzystać z tej

@RequestMapping(value = {"some mapped address","some mapped address with path variable","some mapped address with another path variable"}) 

lista dostępnych adresów URL dla konkretnych metoda

Należy jednak zachować ostrożność podczas tworzenia listy adresów URL, gdy używasz @PathVariable w metodzie podpisu, nie może ona mieć wartości null.

nadzieję, że ta pomoc

Powiązane problemy