Jboss RestEasy не использует кодировку UTF-8

1

Я работаю с Jboss EAP 6.2 с RestEasy библиотеки RestEasy (resteasy-jaxrs 2.2.1.GA) в среде Linux. Тело каждого ответа службы клиента не использует кодировку UTF-8. Следующий пример кода клиента:

ClientRequest request = new ClientRequest(properties.getProperty("sgprof.service.url"));
request.accept("application/json;charset=UTF-8");
request.queryParameter("key", "value");
ClientResponse<String> response = request.post(String.class);
String jsonResponse = response.getEntity();

Я установил UTF-8 в "standalone.sh" JBoss, передавая их JVM. Ниже аргументов, переданных JVM, вы можете мне помочь. Благодарю.

awt.toolkit = sun.awt.X11.XToolkit
    file.encoding = UTF-8
    file.encoding.pkg = sun.io
    file.io.encoding = UTF-8
    file.separator = /
    http.nonProxyHosts = 10.*|*.local|localhost|127.*|idpc*
    http.proxyPort = 8080
    java.awt.graphicsenv = sun.awt.X11GraphicsEnvironment
    java.awt.headless = true
    java.class.path = /home/jboss/jboss-eap-6.2/jboss-modules.jar
    java.class.version = 51.0
    java.endorsed.dirs = /usr/java/jdk1.7.0_51/jre/lib/endorsed
    java.ext.dirs = /usr/java/jdk1.7.0_51/jre/lib/ext:/usr/java/packages/lib/ext
    java.home = /usr/java/jdk1.7.0_51/jre
    java.io.tmpdir = /tmp
    java.library.path = /usr/java/default:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
    java.net.preferIPv4Stack = true
    java.runtime.name = Java(TM) SE Runtime Environment
    java.runtime.version = 1.7.0_51-b13
    java.specification.name = Java Platform API Specification
    java.specification.vendor = Oracle Corporation
    java.specification.version = 1.7
    java.util.logging.manager = org.jboss.logmanager.LogManager
    java.vendor = Oracle Corporation
    java.vendor.url = http://java.oracle.com/
    java.vendor.url.bug = http://bugreport.sun.com/bugreport/
    java.version = 1.7.0_51
    java.vm.info = mixed mode
    java.vm.name = Java HotSpot(TM) 64-Bit Server VM
    java.vm.specification.name = Java Virtual Machine Specification
    java.vm.specification.vendor = Oracle Corporation
    java.vm.specification.version = 1.7
    java.vm.vendor = Oracle Corporation
    java.vm.version = 24.51-b03
    javaEncoding = UTF-8
    javax.management.builder.initial = org.jboss.as.jmx.PluggableMBeanServerBuilder
    javax.xml.datatype.DatatypeFactory = __redirected.__DatatypeFactory
    javax.xml.parsers.DocumentBuilderFactory = __redirected.__DocumentBuilderFactory
    javax.xml.parsers.SAXParserFactory = __redirected.__SAXParserFactory
    javax.xml.stream.XMLEventFactory = __redirected.__XMLEventFactory
    javax.xml.stream.XMLInputFactory = __redirected.__XMLInputFactory
    javax.xml.stream.XMLOutputFactory = __redirected.__XMLOutputFactory
    javax.xml.transform.TransformerFactory = __redirected.__TransformerFactory
    javax.xml.validation.SchemaFactory:http://www.w3.org/2001/XMLSchema = __redirected.__SchemaFactory
    javax.xml.xpath.XPathFactory:http://java.sun.com/jaxp/xpath/dom = __redirected.__XPathFactory
    jboss.home.dir = /home/jboss/jboss-eap-6.2
    jboss.modules.dir = /home/jboss/jboss-eap-6.2/modules
    jboss.modules.system.pkgs = org.jboss.byteman
    jboss.server.base.dir = /home/jboss/jboss-eap-6.2/standalone
    jboss.server.config.dir = /home/jboss/jboss-eap-6.2/standalone/configuration
    jboss.server.data.dir = /home/jboss/jboss-eap-6.2/standalone/data
    jboss.server.deploy.dir = /home/jboss/jboss-eap-6.2/standalone/data/content
    jboss.server.log.dir = /home/jboss/jboss-eap-6.2/standalone/log
    jboss.server.persist.config = true
    jboss.server.temp.dir = /home/jboss/jboss-eap-6.2/standalone/tmp
    logging.configuration = file:/home/jboss/jboss-eap-6.2/standalone/configuration/logging.properties
    module.path = /home/jboss/jboss-eap-6.2/modules
    org.jboss.boot.log.file = /home/jboss/jboss-eap-6.2/standalone/log/server.log
    org.jboss.resolver.warning = true
    org.xml.sax.driver = __redirected.__XMLReaderFactory
    os.arch = amd64
    os.name = Linux
    os.version = 2.6.32-431.el6.x86_64
    path.separator = :
    sun.arch.data.model = 64
    sun.boot.class.path = /usr/java/jdk1.7.0_51/jre/lib/resources.jar:/usr/java/jdk1.7.0_51/jre/lib/rt.jar:/usr/java/jdk1.7.0_51/jre/lib/sunrsasign.jar:/usr/java/jdk1.7.0_51/jre/lib/jsse.jar:/usr/java/jdk1.7.0_51/jre/lib/jce.jar:/usr/java/jdk1.7.0_51/jre/lib/charsets.jar:/usr/java/jdk1.7.0_51/jre/lib/jfr.jar:/usr/java/jdk1.7.0_51/jre/classes
    sun.boot.library.path = /usr/java/jdk1.7.0_51/jre/lib/amd64
    sun.cpu.endian = little
    sun.cpu.isalist = 
    sun.io.unicode.encoding = UnicodeLittle
    sun.java.command = /home/jboss/jboss-eap-6.2/jboss-modules.jar -mp /home/jboss/jboss-eap-6.2/modules -jaxpmodule javax.xml.jaxp-provider org.jboss.as.standalone -Djboss.home.dir=/home/jboss/jboss-eap-6.2 -Djboss.server.base.dir=/home/jboss/jboss-eap-6.2/standalone -Dfile.encoding=UTF-8 -Dfile.io.encoding=UTF-8 -DjavaEncoding=UTF-8 -Dsun.io.unicode.encoding=UnicodeLittle -Dsun.jnu.encoding=UTF-8 -c standalone.xml
    sun.java.launcher = SUN_STANDARD
    sun.jnu.encoding = UTF-8
    sun.management.compiler = HotSpot 64-Bit Tiered Compilers
    sun.os.patch.level = unknown
    user.dir = /home/jboss/jboss-eap-6.2/bin
    user.home = /home/jboss
    user.language = en
  • 0
    Старые версии RESTeasy, к сожалению, соответствовали регистру символов. Можете ли вы попробовать использовать application/json;charset=utf-8 ?
Теги:
character-encoding
utf-8
jboss
resteasy

2 ответа

2

У меня была аналогичная проблема с чтением (HTTP-GET) ресурса с помощью RestEasy с использованием API-интерфейса JaxRS.

Метод getCharset of org.jboss.resteasy.plugins.providers.jsonp.AbstractJsonpProvider используется на клиенте для определения кодировки. В качестве параметра mediaType используется "Content-Type" заголовка ответа:

   public static Charset getCharset(final MediaType mediaType)
   {
      if (mediaType != null)
      {
         String charset = mediaType.getParameters().get("charset");
         if (charset != null) return Charset.forName(charset);
      }
      return Charset.defaultCharset();
   }

Charset.defaultCharset() возвращает windows-1252 на моем компьютере. В сравнении, org.jboss.resteasy.plugins.providers.ProviderHelper использует allways UTF-8 по умолчанию:

String charset = mediaType.getParameters().get("charset");
if (charset != null) return new String(bytes, charset);
else return new String(bytes, "UTF-8");

Я нашел следующие решения:

  • Задайте системное свойство file.encoding = "UTF-8"

  • Добавьте @Produces (MediaType.APPLICATION_XML + "; charset = utf-8") в ресурс jax-rs (если вы являетесь владельцем), чтобы набор символов был объявлен с Content-Type в заголовке ответа.

  • Прочитайте ответ как String и проанализируйте его вручную (Json.createReader (новый StringReader (jsonString)). ReadObject())

1

Вы можете указать кодировку в объявлении сервиса. Проверьте аннотацию @Produces в следующем примере:

@GET
@Path("/customer/{customerUrn}")
@Produces(MediaType.APPLICATION_XML + ";charset=utf-8")
public Response getCustomerProducts(@PathParam("customerUrn")String customer);

Надеюсь, поможет!

  • 0
    Я звоню в сервис. Приложение является клиентом
  • 0
    Извините за ошибку. Вы уверены, что сервис возвращает utf-8? Вы можете проверить http заголовки с soapui
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню