Je dois supporter le format d’URL suivant
/service/country/city/addr1/addr2/xyz.atom
/service/country/city/addr1/addr2/addr3/xyz.atom
où 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:
RequestMapping
qui extrait toutes les données sauf les adresses 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("/");
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.