java - headers - Problema de codificación UTF-8 en Spring MVC
spring mvc utf 8 (8)
Convierta la cadena JSON a UTF-8 por su cuenta.
@RequestMapping(value = "/example.json", method = RequestMethod.GET)
@ResponseBody
public byte[] example() throws Exception {
return "{ ''text'': ''äöüß'' } ".getBytes("UTF-8");
}
Tengo un bean Spring MVC y me gustaría devolver el carácter turco configurando la codificación UTF-8. pero aunque mi cadena es "şŞğĞİıçÇöÖüÜ", vuelve como "?????? ÇÇÖÖüÜ". y también cuando miro la página de respuesta, que es la página de Internet Explorer, la codificación es iso de Europa occidental, no UTF-8.
Aquí está el código:
@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;
}
Cuando intenta enviar caracteres especiales como è, à, ù, etc., puede ver en su página de Jsp Post muchos caracteres como ''£'', ''Ä'' o ''Æ''. Para resolver este problema en el 99% de los casos, puede mover en su web.xml este fragmento de código al principio del archivo:
<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>
Para ver un ejemplo completo, consulte aquí: https://lentux-informatica.com/spring-mvc-utf-8-encoding-problem-solved/
Hay algunas preguntas similares: Problema de codificación de respuesta Spring MVC , HttpMessageConverter personalizado con @ResponseBody para hacer cosas Json .
Sin embargo, mi solución simple:
@RequestMapping(method=RequestMethod.GET,value="/GetMyList")
public ModelAndView getMyList(){
String test = "čćžđš";
...
ModelAndView mav = new ModelAndView("html_utf8");
mav.addObject("responseBody", test);
}
y la vista html_utf8.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>${responseBody}
Sin clases adicionales y configuración.
Y también puede crear otra vista (por ejemplo, json_utf8) para otro tipo de contenido.
Lo he descubierto, puedes agregar al mapeo de solicitudes produce = "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);
}
vea esta publicación en el blog para más detalles sobre la solución
Resolví este problema al inferir el tipo de devolución producida en el primer método de solicitud GET. La parte importante aquí es la
produces="application/json;charset=UTF-8
Entonces, cada uno de ellos usa use / account / **, Spring devolverá application / json; charset = tipo de contenido 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);
}
}
Por lo tanto, no tiene que configurar cada método en su Controlador, puede hacerlo para toda la clase. Si necesita más control sobre un método específico, solo debe deducir el tipo de contenido de retorno producido.
Si está utilizando Spring MVC versión 5, puede establecer la codificación también utilizando la anotación @GetMapping
. Aquí hay un ejemplo que establece el tipo de contenido a JSON y también el tipo de codificación a UTF-8:
@GetMapping(value="/rest/events", produces = "application/json; charset=UTF-8")
Más información sobre la anotación @GetMapping aquí:
También agregue a sus granos:
<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>
Para @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 usa <mvc:annotation-driven/>
debería ser después de beans.
en el contexto de servlet xml de su despachador, debe agregar una propiedad "<property name="contentType" value="text/html;charset=UTF-8" />"
en su viewResolver bean. estamos usando freemarker para las vistas.
se ve algo como esto:
<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
...
<property name="contentType" value="text/html;charset=UTF-8" />
...
</bean>