Spring MVC @PathVariable avec un point (.) est d'obtenir tronquée
C'est la suite de la question
Spring MVC @PathVariable obtention tronqués
Printemps états membres du forum qu'il a fixe(version 3.2) dans le cadre de ContentNegotiationManager. voir le lien ci-dessous.
https://jira.springsource.org/browse/SPR-6164
https://jira.springsource.org/browse/SPR-7632
Dans mon application requestParameter avec .com est tronqué.
Quelqu'un pourrait-il m'expliquer comment utiliser cette nouvelle fonctionnalité? comment est-il configurable à xml?
Remarque: forum du printemps- #1
Spring MVC @PathVariable avec un point (.) est d'obtenir tronquée
Vous devez vous connecter pour publier un commentaire.
Autant que je sache, ce problème n'apparaît que pour les pathvariable à la fin de la requestmapping.
Nous avons été en mesure de résoudre que par la définition de l'expression rationnelle addon dans le requestmapping.
<!-- Spring Configuration needed to avoid URI using dots to be truncated --> <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> <property name="useDefaultSuffixPattern" value="false" /> </bean>
RequestMappingHandlerMapping
ouPathVariable
expression unique?{variable_name:regular_expression}
, nous avons donc ici la variable nomméevariable
, dont la valeur va être appariés en utilisant les regex.+
(où.
signifie "n'importe quel caractère" et+
signifie "une fois ou plus').variable
d'une manière régulière, le Printemps utilise le suffixe des fonctions de détection et tronque tout point. Lorsque vous utilisez regexp correspondance, ces fonctionnalités ne sont pas utilisés de la variable n'a d'égal pour regexp que vous fournissez./path/[email protected]
. Le contrôleur n'a même pas être appelé, mais il fonctionne quand il n'y a qu'un point de/path/[email protected]
. Aucune idée de pourquoi et/ou une solution de contournement?@
est codé URL, sinon vous risquez de rencontrer des problèmes avecsome/[email protected]
être interprété en tant qu'utilisateursome/path
d'accueilfoo.bar
.Printemps considère que quoi que ce soit derrière le dernier point est une extension de fichier tels que
.json
ou.xml
et trucate pour récupérer votre paramètre.Donc si vous avez
/somepath/{variable}
:/somepath/param
,/somepath/param.json
,/somepath/param.xml
ou/somepath/param.anything
entraînera un paramètre avec la valeurparam
/somepath/param.value.json
,/somepath/param.value.xml
ou/somepath/param.value.anything
entraînera un paramètre avec la valeurparam.value
si vous changez de cartographie pour
/somepath/{variable:.+}
comme l'a suggéré, de tout point, y compris la dernière sera considérer comme une partie de votre paramètre :/somepath/param
entraînera un paramètre avec la valeurparam
/somepath/param.json
entraînera un paramètre avec la valeurparam.json
/somepath/param.xml
entraînera un paramètre avec la valeurparam.xml
/somepath/param.anything
entraînera un paramètre avec la valeurparam.anything
/somepath/param.value.json
entraînera un paramètre avec la valeurparam.value.json
Si vous ne vous souciez pas de l'extension de la reconnaissance, vous pouvez le désactiver en substituant
mvc:annotation-driven
automagic :Donc, encore une fois, si vous avez
/somepath/{variable}
:/somepath/param
,/somepath/param.json
,/somepath/param.xml
ou/somepath/param.anything
entraînera un paramètre avec la valeurparam
/somepath/param.value.json
,/somepath/param.value.xml
ou/somepath/param.value.anything
entraînera un paramètre avec la valeurparam.value
remarque : la différence de la configuration par défaut n'est visible que si vous avez une cartographie comme
somepath/something.{variable}
. voir Resthub projet de problèmesi vous souhaitez conserver l'extension de la gestion, depuis le Printemps 3.2 vous pouvez également définir la useRegisteredSuffixPatternMatch propriété de RequestMappingHandlerMapping bean afin de garder suffixPattern reconnaissance activé, mais limitée à un régime enregistré d'extension.
Ici vous définissez uniquement json et xml extensions :
Noter que mvc:annotation-driven accepte maintenant un contentNegotiation option pour fournir une coutume bean, mais la propriété de RequestMappingHandlerMapping doit être changé à true (false par défaut) (cf. https://jira.springsource.org/browse/SPR-7632).
Pour cette raison, vous devez toujours remplacer les tous mvc:annotation-driven configuration. J'ai ouvert un ticket pour le Printemps de demander une coutume RequestMappingHandlerMapping : https://jira.springsource.org/browse/SPR-11253. Merci de voter si vous êtes intereted dans.
Bien que primordial, attention aussi prendre en compte personnalisée de l'Exécution de la gestion primordial. Sinon, tous vos Exception personnalisée mappages échouera. Vous devrez réutiliser messageCoverters avec une liste de haricot :
J'ai mis en place, dans le projet open source Resthub que je suis partie, une série de tests sur ces sujets : voir https://github.com/resthub/resthub-spring-stack/pull/219/files & https://github.com/resthub/resthub-spring-stack/issues/217
Mise à jour pour le Printemps 4: depuis la 4.0.1, vous pouvez utiliser
PathMatchConfigurer
(par l'intermédiaire de votreWebMvcConfigurer
), par exempleEn xml, il serait (https://jira.spring.io/browse/SPR-10163):
matcher.setUseSuffixPatternMatch(false)
pour désactiver complètement le suffixe de match.En plus de Martin Frey réponse, cela peut aussi être corrigé en ajoutant une barre oblique dans le RequestMapping valeur:
Gardez à l'esprit que ce correctif ne prend pas en charge la maintenabilité. Il exige maintenant que toutes les URI pour avoir une barre oblique - quelque chose qui peut ne pas être évident pour les utilisateurs de l'API /les nouveaux développeurs. Parce qu'il est susceptible de ne pas tous les paramètres peuvent avoir une
.
à eux, il peut également créer des intermittents bugsl'ajout de l' ":.+" a fonctionné pour moi, mais pas jusqu'à ce que j'ai enlevé extérieur des accolades.
valeur = {"/nom d'utilisateur/{id:.+}"} ne fonctionne pas
valeur = "/nom d'utilisateur/{id:.+}" œuvres
Espère que j'ai aidé quelqu'un 🙂
id
Au Printemps de Démarrage Reste Contrôleur, j'ai résolu en suivant ces Étapes:
RestController :
Et De Repos Client:
/somepath/{variable:.+}
fonctionne en JavarequestMapping
tag."/{code:.+}"
travaille pour de nombreux points pas l'un c'est à dire61.12.7
il travaille aussi pour savoir[email protected]
Voici une approche qui s'appuie uniquement sur java configuration:
Une manière assez facile de contourner ce problème est d'ajouter une barre oblique ...
par exemple:
utilisation :
au lieu de:
Au Printemps de Démarrage, L'expression Régulière résoudre le problème comme
"/{code:.+}"
travaille pour de nombreux points pas l'un c'est à dire61.12.7
il travaille aussi pour savoir[email protected]
La solution complète, y compris les adresses e-mail dans les noms de chemin d'accès pour le printemps 4.2 est
Ajoutez à cela l'application xml
Si vous utilisez Printemps 3.2.x et
<mvc:annotation-driven />
, de créer ce petitBeanPostProcessor
:Puis mettez ceci dans votre MVC config xml:
BeanPostProcessor
pour cela. Si vous utilisezWebMvcConfigurationSupport
vous pouvez remplacer lerequestMappingHandlerMapping
@Bean
méthode. Si vous utilisez XML de config, vous pouvez simplement déclarer votre propreRequestMappingHandlerMapping
de haricots et de déclarer que les biens.J'ai enfin trouvé la solution dans Printemps Docs:
En ajoutant ceci à mon
WebMvcConfigurerAdapter
mise en œuvre résolu le problème:Pour moi le
ne fonctionne pas mais seulement si vous aussi coder le "point d'équilibre" dans votre url de la requête comme "%2F", alors il fonctionne. Mais nécessite URL à tous que...ce qui n'est pas un "standard" de l'encodage, mais valide. Se sent comme quelque chose d'un bug 😐
L'autre contourner, similaire à la "slash" consiste à déplacer la variable qui sera le point "inline" ex:
@GetMapping(path = "/{variableName}/a")
maintenant, tous les points seront conservés, aucune modification ou à l'expression rationnelle est nécessaire.