151 votes

Spring 3 RequestMapping: Obtenir la valeur du chemin

Existe-t-il un moyen d'obtenir la valeur du chemin complet après l'analyse des valeurs requestMapping @PathVariable ?

C'est-à-dire que /{id}/{restOfTheUrl} devrait pouvoir analyser /1/dir1/dir2/file.html id=1 et restOfTheUrl=/dir1/dir2/file.html

Toute idée serait appréciée.

213voto

axtavt Points 126632

La partie non appariée de l'URL est exposée sous la forme d'un attribut de demande nommé HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE :

 @RequestMapping("/{id}/**")
public void foo(@PathVariable("id") int id, HttpServletRequest request) {
    String restOfTheUrl = (String) request.getAttribute(
        HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);
    ...
}
 

59voto

Fabien Kruba Points 76

Je viens de trouver ce problème correspondant à mon problème. En utilisant les constantes HandlerMapping, j’ai pu écrire un petit utilitaire à cette fin:

 /**
 * Extract path from a controller mapping. /controllerUrl/** => return matched **
 * @param request incoming request.
 * @return extracted path
 */
public static String extractPathFromPattern(final HttpServletRequest request){


    String path = (String) request.getAttribute(
            HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);
    String bestMatchPattern = (String ) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);

    AntPathMatcher apm = new AntPathMatcher();
    String finalPath = apm.extractPathWithinPattern(bestMatchPattern, path);

    return finalPath;

}
 

6voto

sdouglass Points 1263

J'ai utilisé le Tuckey URLRewriteFilter pour gérer les éléments de chemin d'accès qui contiennent des '/' personnages, je ne pense pas que le Printemps 3 MVC soutient encore.

http://www.tuckey.org/

Vous mettez ce filtre dans votre application, et fournir un ML fichier de configuration. Dans ce fichier, vous fournir des règles de réécriture, que vous pouvez utiliser pour traduire les éléments de chemin d'accès contenant " / " caractères dans les paramètres de la demande que Spring MVC pouvez traiter correctement avec l'aide de @RequestParam.

WEB-INF/web.xml:

<filter>
  <filter-name>UrlRewriteFilter</filter-name>
  <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
</filter>
<!-- map to /* -->

WEB-INF/urlrewrite.xml:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite
    PUBLIC "-//tuckey.org//DTD UrlRewrite 3.0//EN"
    "http://tuckey.org/res/dtds/urlrewrite3.0.dtd">
<urlrewrite>
  <rule>
    <from>^/(.*)/(.*)$</from>
    <to last="true">/$1?restOfTheUrl=$2</to>
</urlrewrite>

Méthode de contrôleur:

@RequestMapping("/{id}")
public void handler(@PathVariable("id") int id, @RequestParam("restOfTheUrl") String pathToFile) {
  ...
}

3voto

user2518430 Points 151

Oui, les restOfTheUrl ne renvoient pas uniquement la valeur requise, mais nous pouvons obtenir la valeur en utilisant la correspondance UriTemplate .

J'ai résolu le problème, alors voici la solution de travail pour le problème:

 @RequestMapping("/{id}/**")
public void foo(@PathVariable("id") int id, HttpServletRequest request) {
String restOfTheUrl = (String) request.getAttribute(
    HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);
    /*We can use UriTemplate to map the restOfTheUrl*/
    UriTemplate template = new UriTemplate("/{id}/{value}");        
    boolean isTemplateMatched = template.matches(restOfTheUrl);
    if(isTemplateMatched) {
        Map<String, String> matchTemplate = new HashMap<String, String>();
        matchTemplate = template.match(restOfTheUrl);
        String value = matchTemplate.get("value");
       /*variable `value` will contain the required detail.*/
    }
}
 

0voto

xsampedro Points 1
private final static String MAPPING = "/foo/*";

@RequestMapping(value = MAPPING, method = RequestMethod.GET)
public @ResponseBody void foo(HttpServletRequest request, HttpServletResponse response) {
    final String mapping = getMapping("foo").replace("*", ""); 
    final String path = (String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);
    final String restOfPath = url.replace(mapping, "");
    System.out.println(restOfPath);
}

private String getMapping(String methodName) {
    Method methods[] = this.getClass().getMethods();
    for (int i = 0; i < methods.length; i++) {
        if (methods[i].getName() == methodName) {
            String mapping[] = methods[i].getAnnotation(RequestMapping.class).value();
            if (mapping.length > 0) {
                return mapping[mapping.length - 1];
            }
        }
    }
    return null;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X