RequestMapping avec des barres obliques et des points

Je dois supporter le format d’URL suivant

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

country et city peuvent être mappés sur @PathVariable mais après cela, le chemin peut être dynamic avec plusieurs barres obliques. La partie finale aura .atom ou similaire.

J’ai essayé de suivre, mais aucune des options ne semble fonctionner

  • Wildcard

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

  • Regex

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

  • UseSuffixPatternMatch

    Méthode de substitution dans la classe de configuration

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

Il semble que la combinaison de barres obliques et de points ne fonctionne pas avec les solutions ci-dessus. Je continue à obtenir 406 pour en-tête Accepter ne correspondant pas, ou 404

L’approche la plus dynamic consisterait à utiliser MasortingxVariable pour gérer la liste d’adresses, mais cela n’est pas applicable dans votre contexte car les chemins ne peuvent pas être modifiés pour autant que je sache à partir de votre question.

La meilleure chose à faire pour gérer votre chemin dynamic est de procéder en deux étapes:

  1. Définir un RequestMapping qui extrait toutes les données sauf les adresses
  2. Extraire les adresses manuellement dans la méthode

Donc, pour la première étape, vous aurez quelque chose comme ça:

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

Cette cartographie correspond à tous les chemins requirejs et permet d’extraire le pays, la ville et le nom du fichier.

Dans la deuxième étape, nous utiliserons ce qui a été extrait pour obtenir les adresses en procédant comme suit:

 Ssortingng path = (Ssortingng) request.getAtsortingbute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE); path = path.subssortingng(Ssortingng.format("/service/%s/%s/", country, city).length(), path.length() - Ssortingng.format("%s.atom", file).length()); Ssortingng[] addrs = path.split("/"); 
  1. Tout d’abord, nous extrayons de la requête le chemin complet
  2. Puis on enlève ce que nous avons déjà extrait qui sont ici le début et la fin du chemin
  3. Enfin, nous utilisons Ssortingng.split pour extraire toutes les adresses.

A ce niveau, vous avez tout ce dont vous avez besoin.

Pouvez-vous essayer ceci,

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

Il suffit de spécifier le format regex complet dans lequel vous attendez une extension à la fin de l’URL telle que atom, car celle-ci sera interprétée par défaut comme MediaType par Spring.

une autre solution consiste à spécifier les MediaTypes acceptés

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

Vous pouvez créer des MediaTypes personnalisés s’ils ne sont pas prédéfinis dans Spring.