web-dev-qa-db-fra.com

Problème d'encodage UTF-8 dans Spring MVC

J'ai un bean Spring MVC et je voudrais retourner un caractère turc en définissant le codage UTF-8. mais bien que ma chaîne soit "şŞğĞİıçÇöÖüÜ" elle retourne sous la forme "?????? çÇöÖüÜ". et aussi quand je regarde la page de réponse, qui est la page Internet Explorer, le codage est l'iso d'Europe occidentale, pas UTF-8.

Voici le code:

    @RequestMapping(method=RequestMethod.GET,value="/GetMyList")
public @ResponseBody String getMyList(HttpServletRequest request, HttpServletResponse response) throws CryptoException{
    String contentType= "text/html;charset=UTF-8";
    response.setContentType(contentType);
    try {
        request.setCharacterEncoding("utf-8");
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    response.setCharacterEncoding("utf-8");     
    String str="şŞğĞİıçÇöÖüÜ";
    return str;
}   
42
ysnky

Je l'ai compris, vous pouvez ajouter à la requête mappage produire = "text/plain; charset = UTF-8"

@RequestMapping(value = "/rest/create/document", produces = "text/plain;charset=UTF-8")
@ResponseBody
public void create(Document document, HttpServletRespone respone) throws UnsupportedEncodingException {

    Document newDocument = DocumentService.create(Document);

    return jsonSerializer.serialize(newDocument);
}

voir cet article de blog pour plus de détails sur la solution

58
Charlie Wu

dans votre contexte XML servlet de distributeur, vous devez ajouter une propriété "<property name="contentType" value="text/html;charset=UTF-8" />" sur votre bean viewResolver .

ça ressemble à quelque chose comme ça:

<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
       ...
       <property name="contentType" value="text/html;charset=UTF-8" />
       ...
</bean>
22
aki

Convertissez vous-même la chaîne JSON en UTF-8.

@RequestMapping(value = "/example.json", method = RequestMethod.GET)
@ResponseBody
public byte[] example() throws Exception {

    return "{ 'text': 'äöüß' } ".getBytes("UTF-8");
}
6
rwitzel

Ajoutez aussi à vos haricots:

   <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="messageConverters">
        <array>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <constructor-arg index="0" name="defaultCharset" value="UTF-8"/>
                <property name="supportedMediaTypes">
                    <list>
                        <value>text/plain;charset=UTF-8</value>
                        <value>text/html;charset=UTF-8</value>
                        <value>application/json;charset=UTF-8</value>
                        <value>application/x-www-form-urlencoded;charset=UTF-8</value>
                    </list>
                </property>
        </bean></bean>

Pour @ExceptionHandler:

enter code<bean class="org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver">
    <property name="messageConverters">
        <array>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <constructor-arg index="0" name="defaultCharset" value="UTF-8"/>
                <property name="supportedMediaTypes">
                    <list>
                        <value>text/plain;charset=UTF-8</value>
                        <value>text/html;charset=UTF-8</value>
                        <value>application/json;charset=UTF-8</value>
                        <value>application/x-www-form-urlencoded;charset=UTF-8</value>
                    </list>
                </property>
            </bean>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>text/plain;charset=UTF-8</value>
                        <value>text/html;charset=UTF-8</value>
                        <value>application/json;charset=UTF-8</value>
                        <value>application/x-www-form-urlencoded;charset=UTF-8</value>
                    </list>
                </property>
            </bean>
        </array>
    </property>
</bean>

Si vous utilisez <mvc:annotation-driven/>, cela devrait être après les haricots.

2
Yura_dan

Des questions similaires se posent: Problème de codage de réponse Spring MVC , Personnalisez HttpMessageConverter avec @ResponseBody pour effectuer des opérations Json .

Cependant, ma solution simple:

@RequestMapping(method=RequestMethod.GET,value="/GetMyList")
public ModelAndView getMyList(){
  String test = "čćžđš";
  ...
  ModelAndView mav = new ModelAndView("html_utf8");
  mav.addObject("responseBody", test);
}

et la vue html_utf8.jsp

<%@ page language="Java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>${responseBody}

Aucune classe ni configuration supplémentaire.
Et Vous pouvez également créer une autre vue (par exemple, json_utf8) pour un autre type de contenu.

2
Trung

Lorsque vous essayez d'envoyer des caractères spéciaux tels que è, à, ù, etc., vous verrez peut-être sur votre page Jsp Post de nombreux caractères tels que '£', 'Ä' ou 'Æ' . Pour résoudre ce problème dans 99 % de cas vous pouvez déplacer dans votre web.xml cette partie de code en tête du fichier:

   <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

Pour un exemple complet, voir ici: https://lentux-informatica.com/spring-mvc-utf-8-encoding-problem-solved/

1
Rosario Mezzatesta

J'ai résolu ce problème en déduisant le type de retour généré dans la première requêteProfession GET. La partie importante ici est la 

produces="application/json;charset=UTF-8

Ainsi, pour chaque utilisation/compte/**, Spring renverra application/json; charset = type de contenu UTF-8. 

@Controller
@Scope("session") 
@RequestMapping(value={"/account"}, method = RequestMethod.GET,produces="application/json;charset=UTF-8")
public class AccountController {

   protected final Log logger = LogFactory.getLog(getClass());

   ....//More parameters and method here...

   @RequestMapping(value={"/getLast"}, method = RequestMethod.GET)
   public @ResponseBody String getUltimo(HttpServletResponse response) throws JsonGenerationException, JsonMappingException, IOException{

      ObjectWriter writer = new ObjectMapper().writer().withDefaultPrettyPrinter();
      try {
        Account account = accountDao.getLast();
        return writer.writeValueAsString(account);
      }
      catch (Exception e) {
        return errorHandler(e, response, writer);
      }
}

Ainsi, vous n'avez pas besoin de configurer chaque méthode de votre contrôleur, vous pouvez le faire pour toute la classe. Si vous avez besoin de plus de contrôle sur une méthode spécifique, il vous suffit de déduire le type de contenu de retour produit.

1
miguel.angel

Si vous utilisez Spring MVC version 5, vous pouvez également définir le codage à l'aide de l'annotation @GetMapping. Voici un exemple qui définit le type de contenu sur JSON et le type de codage sur UTF-8:

@GetMapping(value="/rest/events", produces = "application/json; charset=UTF-8")

Plus d'informations sur l'annotation @GetMapping ici:

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/bind/annotation/GetMapping.html

0
gil.fernandes