2017-03-02 2 views
0

Lorsque vous appelez GET http://localhost:8080/things/ZhaD2lk27XQPRJtwrABltd+UTWXcbnY%2FTrpxGP7VDVo= mon application Boot Spring RestController avec un gestionnaire de requêtes comme ceci:Pourquoi plus (+) est-il décodé en espace() dans le chemin d'URL avec le contrôleur de repos de springboot?

@RequestMapping("/things/{thingId}") 
    public ResponseEntity<Thing> getThing(
     @PathVariable String thingId) { 

    System.out.println("thingId=" + thingId); 
    ... 

résultats dans ce qui suit en cours d'impression ZhaD2lk27XQPRJtwrABltd UTWXcbnY/TrpxGP7VDVo= au lieu de ce que je me serais attendu à ZhaD2lk27XQPRJtwrABltd+UTWXcbnY/TrpxGP7VDVo=.

Comme vous pouvez le voir, le plus est transformé en espace. Cela ne devrait pas arriver avec la partie chemin, seulement la partie requête. C'est pourquoi le Spring UriComponentsBuilder.build().encode() que j'utilise pour construire l'URL ne transforme pas le plus en %2B.

J'avais besoin de modifier l'application déjà pour faire fonctionner la barre oblique codée (/). Voir REST Endpoint unreachable if ID in URL contains %2F pour plus de détails. J'utilise SpringBoot 1.4.4.RELEASE qui utilise Tomcat embed 8.5.11.
J'ai essayé d'appeler le service de Spring RestTemplate, Postman et Chrome. Mêmes résultats dans tous les cas, le plus est transformé en espace

+0

Etes-vous en train de taper l'URL dans le navigateur? ou invoquez-vous votre service avec js? ou invoquez-vous votre service à partir d'un client Java? – reos

Répondre

1

J'ai été capable de résoudre après avoir identifié que mon IDE avait automagiquement ajouté spring-boot-starter-undertow au fichier POM. Je n'ai pas exclu spring-boot-starter-tomcat de spring-boot-starter-web, donc je ne suis pas sûr de ce qui se passait sous les couvertures mais la suppression de la dépendance ressort-boot-starter-undertow a résolu le problème.