¿Cómo puedo configurar el juego de caracteres con JAX-RS? Intenté @Produces("text/html; charset=UTF-8")
pero se ignoró y solo se envió text/html
con el encabezado HTTP. Quiero configurar el juego de caracteres dentro de MessageBodyWriter, pero no quiero extraer el tipo de medio analizando la anotación @Produces a través de la reflexión por mí mismo.¿Cómo configurar el juego de caracteres con JAX-RS?
Respuesta
Como Daemon señaló en un comentario, las últimas versiones de JAX-RS (incluyendo la versión estable de septiembre de 2012) ahora hacen soporte la sintaxis @Produces
. De modo que puede usar:
@Produces("text/html; charset=UTF-8")
@Drewch ¿Lo admite JAX-RS 1.1? Parece que no puede encontrar cuándo salió JAX-RS. Intenté '@Produces (MediaType.APPLICATION_JSON +"; charset = UTF-16 ")', pero eso no funcionó. – Luke
@Produces ("text/html; charset = UTF-8") no funcionó en Jersey 2.13. Tenía el mismo problema descrito por @deamon. –
esto no funciona por alguna versión de Jersey es utilizado por Dropwizard 0.9.2 –
Si desea hacer esto en una implementación de JAX-RS de forma neutral, es posible que pueda restablecer Content-Type en MessageBodyWriter. Algo así como:
public void writeTo(Object obj,
Class<?> cls,
Type type,
Annotation[] annotations,
MediaType mt,
MultivaluedMap<String, Object> responseHttpHeaders,
OutputStream stream) throws IOException {
responseHttpHeaders.putSingle(javax.ws.rs.core.HttpHeaders.CONTENT_TYPE, mt.toString() + ";charset=UTF-8");
}
Si tiene diferentes conjuntos de caracteres UTF-8, además de por el método de los recursos, es posible que desee crear una anotación personalizado y añadirlo a cada método de recursos. Luego, intente usar el parámetro de anotaciones en el método writeTo().
Just FYI, Apache Wink admite el uso de juego de caracteres y otros atributos en tipos de medios. Espero que las futuras revisiones de las especificaciones de JAX-RS lo hagan más fácil.
Esto funcionó para mí, la respuesta aceptada no funcionó para mí. –
También es posible utilizar el método ResponseBuilder.header (...) para establecer el tipo de contenido con el juego de caracteres. Vea a continuación un ejemplo de código (usando JAX-RS 1.1.1, CXF 2.3.1).
final Response myResponse = Response.status(Response.Status.BAD_REQUEST)
.entity("La requête n'est pas correcte.\n ...")
.header(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN+"; charset=ISO-8859-15")
.build();
no es necesario configurarlo a través del encabezado, también existe el método 'type()': 'Response.status (Response.Status.BAR_REQUEST) .entity (" La requête n'est pas correcte. \ N ... ") .type (MediaType.TEXT_PLAIN + "; charset = ISO-8859-15"). build(); ' –
Solo para mantenerlo actualizado. No estoy seguro de si esto era compatible con las versiones anteriores de Jersey, pero definitivamente si decide utilizar el método ResponseBuilder.header (...) puede usar el método MediaType con Charset(). De esta manera:
return Response.status(Status.OK)
.entity(result)
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_TYPE.withCharset("utf-8"))
.build());
Aún más corto (y con un mejor tipo de seguridad): use 'javax.ws.rs.core.Response.ResponseBuilder.type (MediaType)' en lugar de 'javax.ws.rs.core.Response.ResponseBuilder.header (HttpHeaders.CONTENT_TYPE , Object) ' – slartidan
Primera configuración @Produces
anotación en sus métodos de clase de recursos.
Luego, en MessageBodyWriter
de su tipo devuelto, se puede hacer esto en writeTo()
método:
response.setContentType(mediaType.toString);
Observación: Usted puede inyectar response
en su writer
por:
@Context
protected HttpServletResponse response;
Lo que hago es a obtener una instancia del objeto de respuesta servlet:
protected @Context HttpServletResponse response;
y después fijar la codificación de caracteres UTF-8:
response.setCharacterEncoding("utf-8");
que funciona para mí.
Esa es la misma respuesta que [A Kra's] (http://stackoverflow.com/a/39097649/1314743). Por favor, solo agregue una respuesta si tiene algo nuevo para contribuir. –
No, no es lo mismo. Giannis usa 'setCharacterEncoding', mientras que To Kra usa un método indirecto es writoTo() de MessageBodyWriter. Giannis es mucho más simple. –
Si se utiliza RESTEasy se puede registrar una Inteceptor:
import org.jboss.resteasy.annotations.interception.ServerInterceptor;
import org.jboss.resteasy.core.ResourceMethodInvoker;
import org.jboss.resteasy.core.ServerResponse;
import org.jboss.resteasy.spi.Failure;
import org.jboss.resteasy.spi.HttpRequest;
import org.jboss.resteasy.spi.interception.PreProcessInterceptor;
import org.jboss.resteasy.plugins.providers.multipart.InputPart;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.ext.Provider;
@Provider
@ServerInterceptor
public class ContentTypeSetter implements PreProcessInterceptor {
@Override
public ServerResponse preProcess(HttpRequest request, ResourceMethodInvoker resourceMethodInvoker) throws Failure, WebApplicationException {
request.setAttribute(InputPart.DEFAULT_CONTENT_TYPE_PROPERTY, "*/*; charset=UTF-8");
return null;
}
}
Nota: Si establece manualmente una @Produces anula las ContentType creados por este interceptor.Si lo hace, configure el juego de caracteres en @Produces
- 1. cómo configurar el juego de caracteres predeterminado?
- 2. PHP + SQL Server: cómo configurar el juego de caracteres para la conexión?
- 3. æøå caracteres de juego de caracteres HTML2PDF
- 4. Recortar cadena con juego de caracteres específico
- 5. URLConnection no obtiene el juego de caracteres
- 6. MySQL Workbench juego de caracteres
- 7. ¿Cómo verificar el juego de caracteres de la cuerda?
- 8. ¿Cómo cambiar el juego de caracteres en Apache Commons?
- 9. Juego de caracteres Oracle JDBC y límite de caracteres 4000
- 10. a juego con los caracteres acentuados Javascript expresiones regulares
- 11. Definir juego de caracteres predeterminado para htmlentities()
- 12. UTF-8 juego de caracteres MySQL y
- 13. .NET C# - MigraDoc - ¿Cómo cambiar el juego de caracteres del documento?
- 14. ¿Debo usar entidades HTML para caracteres especiales si estoy usando el juego de caracteres UTF-8?
- 15. Cómo utilizar CXF, JAXRS y almacenamiento en caché HTTP
- 16. Django set Motor de almacenamiento y juego de caracteres predeterminado
- 17. ¿Cómo puedo obtener el juego de caracteres de una cadena/búfer?
- 18. ¿Cómo establecer un juego de caracteres en el correo electrónico usando smtplib en Python 2.7?
- 19. ¿Cómo configurar el servidor JBoss con Netbeans?
- 20. Optimización de JaxRS/Jackson para excluir nulos, listas vacías, matrices
- 21. ¿Qué juego de caracteres usa Microsoft Excel al guardar archivos?
- 22. ¿Qué juego de caracteres debería asumir los caracteres codificados en una URL para estar?
- 23. Mysql cambia el juego de caracteres predeterminado de la tabla al conjunto de caracteres de la base de datos
- 24. ¿Cuándo necesito escapar caracteres dentro de un juego de caracteres regex (dentro de [])?
- 25. Uso del juego de caracteres UTF-8 con PHP: ¿se requieren funciones de mb?
- 26. el juego no es reconocido por el centro de juego
- 27. ¿Obtiene el juego de caracteres de la configuración regional actual en C?
- 28. ¿Cómo puedo configurar el número permitido de caracteres del parámetro GET en uWSGI?
- 29. Marco de juego: ¿Cómo cambiar los paquetes predeterminados de juego?
- 30. Cómo configurar Beanstalkd con PHP
'@Produces (" text/html; charset = UTF-8 ")' funciona con las versiones actuales de la implementación de referencia Jersey. – deamon
También puede asegurarse de que esto ocurra en todas partes para todas las anotaciones @Produces ("text/html") utilizando la técnica [descrita aquí en una pregunta SO similar] (http://stackoverflow.com/a/23479647/26510). –