Tengo en mi aplicación web Spring MVC Java de Annotation ejecutada en el servidor web de embarcadero (actualmente en el complemento de embarcadero de Maven).
Estoy tratando de hacer algo de soporte AJAX con un método de controlador que devuelve solo el texto de ayuda de String. Los recursos están en codificación UTF-8 y también la cadena, pero mi respuesta del servidor viene con
content-encoding: text/plain;charset=ISO-8859-1
incluso cuando mi navegador envía
Accept-Charset windows-1250,utf-8;q=0.7,*;q=0.7
Estoy usando de alguna manera la configuración predeterminada de spring
He encontrado una pista para agregar este bean a la configuración, pero creo que simplemente no se usa, porque dice que no admite la codificación y en su lugar se usa uno predeterminado.
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes" value="text/plain;charset=UTF-8" />
</bean>
Mi código de controlador es (tenga en cuenta que este tipo de cambio de respuesta no funciona para mí):
@RequestMapping(value = "ajax/gethelp")
public @ResponseBody String handleGetHelp(Locale loc, String code, HttpServletResponse response) {
log.debug("Getting help for code: " + code);
response.setContentType("text/plain;charset=UTF-8");
String help = messageSource.getMessage(code, null, loc);
log.debug("Help is: " + help);
return help;
}
DispatcherServlet
's config (...-servlet.xml
)Encontré la solución para Spring 3.1. con el uso de la anotación @ResponseBody. Aquí hay un ejemplo de controlador que usa salida Json:
fuente
<mvc:annotation-driven/>
en applicationContext. (En lugar de<bean class=" [...] DefaultAnnotationHandlerMapping"/>
, lo cual está en desuso en la primavera 3.2 de todos modos ...)produces
atributo.MediaType.APPLICATION_JSON_UTF8_VALUE
.Tenga en cuenta que en Spring MVC 3.1 puede usar el espacio de nombres MVC para configurar convertidores de mensajes:
O configuración basada en código:
fuente
Accept-Charset
encabezado que probablemente enumera cada codificación de caracteres conocida, y 2) cuando la solicitud tiene unAccept
encabezado, lasupportedMediaTypes
propiedad del convertidor no se usa , por ejemplo, cuando hago la solicitud escribiendo directamente la URL en un navegador, la respuesta tiene unContent-Type: text/html
encabezado en su lugar.<bean class="org.springframework.http.converter.StringHttpMessageConverter"><constructor-arg value="UTF-8" /></bean>
En caso de que también pueda configurar la codificación de la siguiente manera:
Creo que usar StringHttpMessageConverter es mejor que esto.
fuente
the manifest may not be valid or the file could not be opened.
en IE 11. ¡Gracias digz!puede agregar produce = "text / plain; charset = UTF-8" a RequestMapping
mira este blog para más detalles
fuente
Estaba luchando contra este problema recientemente y encontré una respuesta mucho mejor disponible en Spring 3.1:
Entonces, tan fácil como JAX-RS como todos los comentarios indicaron que podría / debería ser.
fuente
produces
dice: "... la solicitud solo se asigna si Content-Type coincide con uno de estos tipos de medios". lo que significa AFAIK queproduces
es relevante si el método coincide con una solicitud y no con qué tipo de contenido debería tener la respuesta.Puede usar produce para indicar el tipo de respuesta que está enviando desde el controlador. Esta palabra clave "produce" será más útil en la solicitud ajax y fue muy útil en mi proyecto
fuente
Gracias digz6666, su solución funciona para mí con ligeros cambios porque estoy usando json:
La respuesta dada por axtavt (que me has recomendado) no funcionará para mí. Incluso si he agregado el tipo de medio correcto:
fuente
Configuré el tipo de contenido en MarshallingView en el bean ContentNegotiatingViewResolver . Funciona fácilmente, limpio y sin problemas:
fuente
Estoy usando CharacterEncodingFilter, configurado en web.xml. Quizás eso ayude.
fuente
forceEncoding=true
él también se filtra la respuesta, pero no ayudaría en este caso.forceEncoding=false
. Simplemente lo configuréfalse
y "charset = UTF-8" se agregó con éxito alContent-Type
encabezado.si nada de lo anterior funcionó para usted, intente hacer solicitudes ajax en "POST" y no en "GET", eso funcionó muy bien para mí ... ninguno de los anteriores funcionó. También tengo el personaje EncodingFilter.
fuente
Después de haber intentado muchas soluciones para este problema ... lo pensé y funciona bien.
fuente
La manera simple de resolver este problema en Spring 3.1.1 es que: agregue los siguientes códigos de configuración en
servlet-context.xml
No es necesario anular ni implementar nada.
fuente
si decide solucionar este problema mediante la siguiente configuración:
debe confirmar que solo debe haber una etiqueta mvc: basada en anotaciones en todo su archivo * .xml. de lo contrario, la configuración puede no ser efectiva.
fuente
De acuerdo con el enlace "Si no se especifica una codificación de caracteres, la especificación de Servlet requiere que se utilice una codificación de ISO-8859-1". Si está utilizando Spring 3.1 o posterior, use la siguiente configuración para configurar charset = UTF-8 cuerpo de respuesta
@RequestMapping (value = "su url de mapeo", produce = "text / plain; charset = UTF-8")
fuente
Configuración de muestra:
fuente