2016-03-14 19 views
9

muszę wspierać następujące formacie URLRequestMapping z ukośniki i kropki

/service/country/city/addr1/addr2/xyz.atom /service/country/city/addr1/addr2/addr3/xyz.atom

gdzie country i city mogą być odwzorowywane @PathVariable ale po że droga może być dynamiczny z wieloma ukośniki. Część końcowa będzie miała numer .atom lub podobny.

Próbowałem następujących, ale żadna z opcji wydaje się działać

  • Wildcard

    @RequestMapping(value="/service/{country}/{city}/**")

  • Regex

    @RequestMapping(value="/service/{country}/{city}/{addr:.+}")

  • Używaj SuffixPatternMatch


    metoda override w Config klasy

    @Override 
    public void configurePathMatch(PathMatchConfigurer configurer) { 
        configurer.setUseSuffixPatternMatch(false); 
    } 
    

Wygląda kombinacji slash i kropki nie działają z powyższych rozwiązań. ciśgle 406 dla niedopasowanych Zebrane nagłówek lub 404

+0

Prośba o podanie powodu dla downvote – sidgate

+1

Witam, próbowałem twojej pierwszej opcji, RequestMapping (value = "/ service/{country}/{city}/**") i działa dla dynamicznego adresu URL z wieloma ukośnikami – cralfaro

+1

406 nie ma nic wspólnego ze ścieżką. Wygląda na to, że masz rację, ale kontroler nie jest w stanie dostarczyć treści w wymaganym formacie. – zeroflagL

Odpowiedz

2

Najbardziej dynamicznym podejściem byłoby użycie MatrixVariable do zarządzania listą adresów, ale nie ma to zastosowania w kontekście, ponieważ ścieżki nie mogą być modyfikowane tak daleko, jak rozumiem na podstawie twojego pytania.

Najlepszą rzeczą, jaką możesz zrobić, aby zarządzać swoją dynamiczną ścieżkę ma przebiegać w dwóch etapach:

  1. ustawić RequestMapping że pobiera wszystkie dane z wyjątkiem adresów
  2. Wyciąg adresy ręcznie w metodzie

więc w pierwszym etapie trzeba będzie coś takiego:

@RequestMapping(value="/service/{country}/{city}/**/{file}.atom") 
    public String service(@PathVariable String country, 
     @PathVariable String city, @PathVariable String file, 
     HttpServletRequest request, Model model) { 

To odwzorowanie jest zgodne ze wszystkimi wymaganymi ścieżkami i umożliwia wyodrębnienie kraju, miasta i nazwy pliku.

W drugim etapie będziemy używać tego, co zostało wyodrębnione do dostać adresy robiąc coś takiego:

String path = (String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE); 
path = path.substring(String.format("/service/%s/%s/", country, city).length(), 
         path.length() - String.format("%s.atom", file).length()); 
String[] addrs = path.split("/"); 
  1. najpierw wydobywamy z żądania pełną ścieżkę
  2. Następnie usuwamy co już wyodrębniliśmy, tutaj jest początek i koniec ścieżki
  3. Następnie w końcu używamy String.split, aby wyodrębnić wszystkie adresy

Na tym poziomie masz wszystko, czego potrzebujesz.

+0

Dzięki za odpowiedź. To jest najbliższy, jaki mogłem dostać. Jedyne, co wymagało zmiany, to rozszerzenie na końcu, które w moim przypadku jest zmienne. W związku z tym końcowe mapowanie żądań wygląda jak '@RequestMapping (value ="/service/{country}/{city}/**/{addr}. {Extn} ") – sidgate

1

można spróbować,

@RequestMapping(value="/service/{country}/{city}/{addr:[a-z]+\\\\.(atom|otherExtensions)}") 

prostu trzeba podać pełną formatu regex którym spodziewasz rozszerzenie na końcu adresu URL taki jak atom, ponieważ zostanie to domyślnie zinterpretowane jako MediaType przez Spring.

Innym rozwiązaniem jest określenie akceptowanych mediatypes

@RequestMapping(value="/service/{country}/{city}/{addr}", consumes = {MediaType.ATOM, MediaType...}) 

Można tworzyć niestandardowe mediatypes jeśli nie jest predefiniowane wiosną.