Почему плюс (+) декодируется в пробел () в URL-адресе с помощью контроллера отдыха Springboot?

При вызове GET http://localhost:8080/things/ZhaD2lk27XQPRJtwrABltd+UTWXcbnY%2FTrpxGP7VDVo= моего приложения Spring Boot RestController с таким обработчиком запросов:

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

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

приводит к тому, что следующее печатается ZhaD2lk27XQPRJtwrABltd UTWXcbnY/TrpxGP7VDVo= вместо того, что я ожидал ZhaD2lk27XQPRJtwrABltd+UTWXcbnY/TrpxGP7VDVo=.

Как видите, плюс превращается в пробел. Этого не должно происходить с частью пути, только с частью запроса. Вот почему Spring UriComponentsBuilder.build().encode(), который я использую для создания URL-адреса, не превращает плюс в %2B.

Мне нужно было настроить приложение, чтобы закодированная косая черта (/) работала. Дополнительные сведения см. в разделе Конечная точка REST недоступна, если идентификатор в URL-адресе содержит %2F.

Я использую SpringBoot 1.4.4.RELEASE, в котором используется Tomcat Embed 8.5.11.
Я пытался вызвать службу из Spring RestTemplate, Postman и Chrome. Одинаковые результаты во всех случаях, плюс превращается в пробел


person justinrknowles    schedule 02.03.2017    source источник
comment
Вы вводите URL в браузере? или вы вызываете свой сервис с помощью js? или вы вызываете свой сервис из java-клиента?   -  person reos    schedule 02.03.2017


Ответы (1)


Я смог решить эту проблему после того, как обнаружил, что моя среда IDE автоматически добавила spring-boot-starter-undertow в файл POM. Я не исключал spring-boot-starter-tomcat из spring-boot-starter-web, поэтому я не уверен, что происходит под обложками, но удаление зависимости spring-boot-starter-undertow решило проблему.

person justinrknowles    schedule 03.03.2017