2014-09-11 18 views
5

Reading this (wiosna 3) artykuł z 2010 roku, omawia używając rozszerzenia, aby zapewnić wygodny sposób zawierać opcjonalną ścieżkę segmenty:opcjonalne segmenty ścieżki w Spring MVC

@RequestMapping("/houses/[preview/][small/]{id}") 
public String handlePreview(@PathVariable long id, @PathVariable("preview/") boolean preview, @PathVariable("small/") boolean small) { 
    return "view"; 
} 

wiem, może po prostu wdrożyć szereg od żądań przekształceniach aby osiągnąć ten sam efekt:

@RequestMapping(value="/houses/preview/{id}") 
... 

@RequestMapping(value="/houses/{id}") 
... 
~~~ snip ~~~ 

Ale w zależności od liczby możliwych permutacji, wydaje się opcją bardzo gadatliwym.

Czy jakakolwiek późniejsza wersja Spring (po 3) zapewnia taki obiekt? Alternatywnie, czy istnieje jakiś mechanizm łączenia części adresu URL żądania w celu dostarczenia większego podpisu metody odpowiedzi?

Aktualizacja

This answer do kwestii odnoszących się do udostępniania zmiennych ścieżek i parametrów żądania sugeruje podejście jak:

@RequestMapping(method=RequestMethod.GET, value={"/campaigns","/campaigns/{id}"}) 
    @ResponseBody 
    public String getCampaignDetails(
     @PathVariable("id") String id) 
    { 
     ~~~ snip ~~~ 

ale zmienna ścieżka nie może być ustawiona na null. Po prostu przejście na /campaigns zwróci odpowiedź 400.

+1

chcesz jak http://stackoverflow.com/questions/2745471/spring- web-mvc-use-to-request-mapping-for-request-parametr-i-path-variable # 2746361 –

+0

Prawie, odpowiedź Javiego z wieloma wartościami żądań - "value = {"/campaigns ","/campaigns/{ id} "}' jest już prawie na miejscu, ale chciałbym zmapować stałe segmenty w adresie URL. – Mikaveli

+0

to pytanie zostało już omówione na jednym forum, to samo jest zadawane tutaj: http://java.dzone.com/articles/spring-3-webmvc-optional-path –

Odpowiedz

8

Dlaczego nie używasz java.util.Optional, jeśli używasz Java 1.8. Aby wziąć nowszy przykład, można uniknąć odpowiedzi 400 ze umieścić Optional<String> zamiast String reprezentujących eventualy ścieżkę tak:

@RequestMapping(method=RequestMethod.GET, value={"/campaigns","/campaigns/{id}"}) 
@ResponseBody 
public String getCampaignDetails(
    @PathVariable("id") Optional<String> id) 
{ 
    if(id.isPresent()){ 
     model.addAttribute("id", id.get());//id.get() return your String path 
    } 
}