2010-06-02 20 views
13

Tengo una aplicación web de demostración que crea usuarios. Cuando trato de insertar datos en otros idiomas (como francés), los caracteres no están codificados correctamente. El código en el controlador es:Problema de codificación usando Spring MVC

@SuppressWarnings("unchecked") 
    @RequestMapping(value = "/user/create.htm", params={"id"}, method = RequestMethod.GET) 
    public String edit(@RequestParam("id") Long id, ModelMap model) { 
     System.out.println("id is " + id); 
     User user = userService.get(id); 

     model.put("user", user); 
     return "user/create"; 
    } 

    @RequestMapping(value = "/user/create.htm", method = RequestMethod.POST) 
    public String save(@ModelAttribute("user") User user, BindingResult result) { 

     System.out.println(user.getFirstName()); 
     System.out.println(user.getLastName()); 


     validator.validate(user, result); 
     if(result.hasErrors()) { 
      return "user/create"; 
     } 

     userService.save(user); 
     return "redirect:list.htm"; 
    } 

mi web.xml es:

... 

    <filter> 
     <filter-name>encoding-filter</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>encoding-filter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

... 

y la página es:

<%@ page language="java" contentType="text/html; charset=UTF-8" 
    pageEncoding="UTF-8"%> 
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> 
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 

... 

<form:form method="post" commandName="user"> 

... 

<form:input path="firstName" cssErrorClass="form-error-field"/> 

... 

cuando entro en algunos caracteres fritas en el primer nombre, entonces la salida del system.out.println es ????+????? o algo similar.

Vi a otras personas arreglar esto con el CharacterEncodingFilter pero esto no parece funcionar.

Muchas gracias.

Editado el valor del filtro.

+0

sí, tienes razón, estaba probando varias cosas y me olvidé de editarlo de nuevo. El problema es el mismo aunque –

Respuesta

2

Quizás me falta algo, pero si la codificación de página en su JSP es "UTF-8", ¿no debería la codificación en su CharacterEncodingFilter ser UTF-8 en lugar de ISO-8859-7?

0

La salida de System.out.println() depende de la codificación de la consola, por lo que no es una buena manera de depurar los problemas de codificación.

Para comprobar que sus valores se decodifican correctamente, debe mostrarlo en otra página. En realidad, ya está hecho en el caso de una falla en la validación de formularios, por lo que su sistema funciona bien si los valores en los campos siguen siendo los mismos después del error de validación.

7

Si esto no funciona y está utilizando Tomcat como servidor de aplicaciones intenta establecer la siguiente opción en cada elemento de <Connector> en el server.xml:

<Connector URIEncoding="UTF-8" ...> 
    ... 
</Connector> 

Esto hizo el truco para mí. Puede haber opciones similares para otros servidores de aplicaciones, por lo que es posible que desee verificar la documentación del servidor.

+0

Esto me solucionó el mismo problema – Kerb

11

Intente hacer que CharacterEncodingFilter sea el primer filtro en web.xml.

Me doy cuenta de que esta pregunta es un poco antigua, pero acabo de encontrarme con el mismo problema, y ​​el movimiento de CharacterEncodingFilter me lo arregló.

1

Debe agregar accept-charset = "UTF-8" a su formulario.

+0

Esto me sirvió de algo. ¡Gracias! – Robin

0

Hay dos cosas para ayudar:

  1. En el archivo setenv.sh añadir JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=utf-8"
  2. En el guión que se inicia el proceso de Tomcat, establecer el entorno LANG: export LANG='utf-8'

Esto puede entonces probarse examinando el juego de caracteres predeterminado: Charset.defaultCharset().

Cuestiones relacionadas