Я работаю с 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
У меня была аналогичная проблема с чтением (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())
Вы можете указать кодировку в объявлении сервиса. Проверьте аннотацию @Produces в следующем примере:
@GET
@Path("/customer/{customerUrn}")
@Produces(MediaType.APPLICATION_XML + ";charset=utf-8")
public Response getCustomerProducts(@PathParam("customerUrn")String customer);
Надеюсь, поможет!
application/json;charset=utf-8
?