web-dev-qa-db-fra.com

@PathVariable in Spring Boot avec des barres obliques dans l'URL

Je dois obtenir les paramètres de l'URL en utilisant @PathValiable dans l'application SpringBoot. Ces paramètres ont souvent slashes. Je n'ai pas de contrôle sur ce qu'un utilisateur entre dans l'URL, donc j'aimerais obtenir ce qu'il a entré et ensuite je peux le gérer.

J'ai déjà parcouru tous les documents et toutes les réponses, je ne pense pas que la bonne solution pour moi consiste à demander aux utilisateurs de coder les paramètres entrants.

Le code SpringBoot est simple: 

@RequestMapping("/modules/{moduleName}")
@ResponseBody
public String moduleStrings (@PathVariable("moduleName") String moduleName) throws Exception {

  ...

}

Donc, l'URL par exemple serait la suivante:

http://localhost:3000/modules/...

Le problème est que le param nomModule comporte souvent des barres obliques. Par exemple, 

metadata-api\cb-metadata-services OR
app-customization-service-impl\\modules\\expand-link-schemes\\common\\app-customization-service-api

Donc, un utilisateur peut entrer définitivement:

http://localhost:3000/modules/metadata-api\cb-metadata-services

Est-il possible d'obtenir tout ce que l'utilisateur a entré dans l'URL après / modules/?

Si quelqu'un me dit quels sont les bons moyens de gérer ce problème.

7
Kirill Ch

Ce code obtient le chemin complet:

@RequestMapping(value = "/modules/{moduleBaseName}/**", method = RequestMethod.GET)
@ResponseBody
public String moduleStrings(@PathVariable String moduleBaseName, HttpServletRequest request) {
    final String path =
            request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE).toString();
    final String bestMatchingPattern =
            request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE).toString();

    String arguments = new AntPathMatcher().extractPathWithinPattern(bestMatchingPattern, path);

    String moduleName;
    if (null != arguments && !arguments.isEmpty()) {
        moduleName = moduleBaseName + '/' + arguments;
    } else {
        moduleName = moduleBaseName;
    }

    return "module name is: " + moduleName;
}
8
P.J.Meisch

En me basant sur la réponse de P.J.Meisch, je suis arrivé à la solution simple pour mon cas. En outre, cela permet de prendre en compte plusieurs barres obliques dans le paramètre URL. Cela ne permet pas non plus de travailler avec des barres obliques inverses comme dans la réponse précédente.

@RequestMapping(value = "/modules/**", method = RequestMethod.GET)
@ResponseBody
public String moduleStrings(HttpServletRequest request) {

    String requestURL = request.getRequestURL().toString();

    String moduleName = requestURL.split("/modules/")[1];

    return "module name is: " + moduleName;

}
2
Kirill Ch