2014-02-15 3 views
1

У меня проблема 1 и я не могу решить. Я получаю запрос POST и получаю переменную от RequestMapping, но в кодировке все неправильно.@PathVariable проблемы с кодированием - Spring MVC

Запрос URL: 127.0.0.1:8080/projeto/ws/cidade/Uberl%C3%A2ndia

Контроллер:

@RequestMapping (value = "/city/{name}", method=RequestMethod.POST, produces=MediaType.APPLICATION_JSON_VALUE) 
     public ResponseEntity<?> doGetPath(@PathVariable("name") String name) { 
} 

Значение возвращается на @PathVariable ("имя «): Uberlà ¢ NDIA

Правильный возврат: Uberlândia

Может ли кто-нибудь мне помочь?

+0

Это дубликат [этот вопрос] [1] [1]: http://stackoverflow.com/questions/4470787/spring-rest-pathvariable-character-encoding –

+0

не это моя проблема. это не работает. –

ответ

2

Это связано с тем, что кодировка символов используется JVM, где работает контроллер, чем кодировка, используемая для кодирования запроса.

Чтобы увидеть это, возьмите кодированный URL 127.0.0.1:8080/projeto/ws/cidade/Uberl%C3%A2ndia и пройдите через http://www.url-encode-decode.com/ с UTF-8, результатом будет Uberlândia.

Но если декодирование выполняется с помощью ISO-2022-CN, результатом является Uberlândia.

Чтобы исправить это, строка должна быть декодирована так же, как и закодирована.

Чтобы изменить кодировку, используемую сервером глобальным способом, можно установить кодировку, используемую JVM для UTF-8, см. Это answer. CharacterEncodingFilter гарантирует, что содержимое HTTP-запросов будет декодировано с помощью данной кодировки.

Другой способ заключается в том, чтобы клиент отправил запрос для его кодирования так, как ожидает сервер.

Но, чтобы избежать этих проблем в общем, вы, вероятно, хотите, чтобы каждый компонент вашей системы настроен на использование UTF-8.

0

Мое решение: Создание класса:

public class UrlPathHelperFixed extends UrlPathHelper { 

    public UrlPathHelperFixed() { 
     super.setUrlDecode(false); 
    } 

    @Override 
    public void setUrlDecode(boolean urlDecode) { 
     if (urlDecode) { 
      throw new IllegalArgumentException("Handler does not support URL decoding."); 
     } 
    } 

    @Override 
    public String getServletPath(HttpServletRequest request) { 
     String servletPath = getOriginatingServletPath(request); 
     return servletPath; 
    } 


    @Override 
    public String getOriginatingServletPath(HttpServletRequest request) { 
     String servletPath = request.getRequestURI().substring(request.getContextPath().length()); 
     return servletPath; 
    } 
} 

Изменение весенне-mvc.xml к:

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"> 
     <property name="order" value="-1"></property> 
     <property name="urlPathHelper"> 
      <bean class="br.com.delivery.utils.UrlPathHelperFixed"/> 
     </property> 
    </bean> 

И конфигурации Maven-compilter к:

<properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 
... 
<artifactId>maven-compiler-plugin</artifactId> 
       <version>2.3.2</version> 
       <configuration> 
        <source>1.7</source> 
        <target>1.7</target> 
        <encoding>${project.build.sourceEncoding}</encoding> 
       </configuration> 

И

UriUtils.decode(nome, "UTF-8") 
Смежные вопросы