En essayant de créer REST-ful Url avec de multiples points dans le “nom de fichier” partie - Spring MVC 3.0
Je suis à l'aide de Spring MVC (3.0) avec l'annotation-driven contrôleurs. Je voudrais créer REST-ful Url de ressources et d'être en mesure de pas besoin (mais toujours en option permettent) l'extension de fichier à la fin de l'URL (mais supposons HTML type de contenu si pas d'extension). Cela fonctionne out-of-the-box avec Spring MVC, tant qu'il n'y a pas de points (période complète/arrêt) dans la partie du nom de fichier.
Cependant certains de mes Url nécessitent un identifiant sous forme de points dans le nom. E. g. comme ceci:
http://company.com/widgets/123.456.789.500
Dans ce cas looks Printemps pour un type de contenu de l'extension .500
et ne les trouve pas si des erreurs. Je peux utiliser des solutions de rechange comme l'ajout de .html
à la fin, l'encodage de l'identifiant ou l'ajout d'une barre oblique. Je ne suis pas d'accord avec les si ces, mais pourrait probablement vivre avec l'ajout de .html
.
J'ai en vain cherché un moyen de passer outre l'extension de fichier par défaut de détection au Printemps.
Est-il possible de personnaliser ou de désactiver l'extension de fichier de détection pour une méthode de contrôleur ou de modèle d'URL, etc?
OriginalL'auteur nickdos | 2010-01-16
Vous devez vous connecter pour publier un commentaire.
La
@PathVariable
pattern matching est un peu nerveux quand il s'agit de points dans l'URL (voir SPR-5778). Vous pouvez le rendre moins crispés (mais plus pointilleux), et d'obtenir un meilleur contrôle sur les dot-lourds Url, par la définition de lauseDefaultSuffixPattern
bien surDefaultAnnotationHandlerMapping
àfalse
.Si vous ne l'avez pas déjà explicitement déclaré
DefaultAnnotationHandlerMapping
dans votre contexte (et la plupart des gens ne le font pas car il l'a déclaré implicitement pour vous), alors vous pouvez l'ajouter explicitement, et de définir cette propriété.Trié le problème avec contentNegotiatingViewResolver explicitement associe dans ce cas ma méthode de contrôleur avec l'URL, y compris l' ".json". E. g. à l'aide de l'annotation: @RequestMapping(valeur = "/recherche.json", method = RequestMethod.GET). Est-il une meilleure solution?
Avez-vous essayé
@RequestMapping(value = "/search*")
?> Avez-vous essayé @RequestMapping(valeur = "/recherche*") Merci encore skaffman, c'est une meilleure solution.
OriginalL'auteur skaffman
Probablement, c'est un vilain hack, je voulais simplement explorer les possibilités d'extension de Printemps @MVC. Voici un personnalisé
PathMatcher
. Il utilise$
dans le modèle comme le marqueur de fin - si le modèle se termine avec elle, le marqueur est retiré et que le motif est compensée par le défaut de correspondance, mais si le modèle a$
dans le milieu (par exemple,...$.*
), un tel modèle ne correspond pas.Config:
Et de l'usage (donné "/hello/1.2.3",
value
est "1.2.3"):EDIT:: Maintenant, ne rompt pas "slash n'a pas d'importance" règle
OriginalL'auteur axtavt
@Controller
public class MyController {
@RequestMapping(value="/widgets/{preDot}.{postDot}")
public void getResource(@PathVariable String preDot, @PathVariable String postDot) {
String fullPath = preDot + "." + postDot;
//...
}
}
//Code ci-dessus doivent correspondre à /widgets/111.222.333.444
OriginalL'auteur
Printemps 3.2 a changé, et vous suggère de définir des propriétés sur le
RequestMappingHandlerMapping
bean, soit explicitement (si vous n'utilisez pas le mvc espace de noms) ou à l'aide d'un BeanPostProcessor telles que les suivantes (vous aurez besoin de numériser ou de l'instancier):Vous pouvez aussi ajouter
:.*
à votre @RequestMapping, par exemple"/{documentPath:.*}"
(voir JIRA commentaire)OriginalL'auteur paulcm
J'ai eu le même problème et j'ai aussi résolu par la coutume PathMatcher. Ma solution est un peu plus simple à ce axtavt proposé. Mon PathMatcher a aussi une finale privée AntPathMatcher cible, et il délégués de tous les appels à elle inchangée, sauf pour la méthode match ():
Cela fonctionne parce que le Printemps essaie de faire correspondre les contrôleurs en ajoutant "." jusqu'à la fin. Par exemple, avec chemin d'accès de la cartographie "/widgets/{id}" et l'URL "/widgets/1.2.3.4", Printemps essaye premier match contre "/widgets/{id}." et après "/widgets/{id}". La première sera de match, mais il ne laisse que "1.2.3" pour id.
Mon PatchMatcher spécifiquement rejette les modèles se terminant par ".*", ainsi, la première tentative échoue et le deuxième correspond à.
Si vous utilisez ContentNegotiatingViewResolver vous pouvez toujours spécifier le type de contenu dans les URL à l'aide du paramètre de la requête "format" (si l'favorParameter est définie à true).
-jarppe
OriginalL'auteur Jarppe
JFY: dans Printemps 4 ce problème est résolu par le biais de: WebMvcConfigurerAdapter.
Ou via WebMvcConfigurationSupport comme ici.
et dans Printemps 5:
OriginalL'auteur pls
À ajouter à skaffman réponse, si vous utilisez
<mvc:annotation-driven/>
et vous souhaitez remplacer la useDefaultSuffixPattern valeur, vous pouvez remplacer le<mvc:annotation-driven>
étiquette avec le texte suivant:OriginalL'auteur Templar