Содержимое, закодированное в CXF RS и JAX-WS, не читается

Моя проблема двойная, и это связано с кодировкой. У меня есть веб-приложение REST, развернутое на JBoss 7.1.1. У него есть адаптеры для внешней веб-службы, для которой я создал заглушки с CXF java2wsdl из предоставленных WSDL. Во время запросов/ответов на этот внешний веб-сервис запросы и ответы могут содержать закодированный в Болгарии контент.

Проблема в том, что этот закодированный контент неправильно отправляется/используется ни моими службами REST, ни моими адаптерами SOAP, пока он из SOAPUI. Ниже приведен пример

REST CALL передает параметр "Тест Тест" как

@PathParam("имя_приемника") Строка имя_приемника

Заголовок содержит charset=UTF-8

Журнал сервера с использованием перехватчика ведения журналов cxf регистрирует следующее:

--------------------------------------
 Inbound Message
----------------------------
ID: 32
Address:     http://127.0.0.1:8080/rest/request/card/10122083/%D0%A2%D0%B5%D1%81%D1%82%20%D0%A2%D0%B5%D1%81%D1%82/1234124143312
Encoding: UTF-8
Http-Method: POST
Content-Type: application/json; charset=UTF-8
    Headers: {Accept=[application/json], accept-encoding=[gzip, deflate], accept-language=    [en-gb,en;q=0.5], cache-control=[no-cache], connection=[keep-alive], Content-Length=[313],     content-type=[application/json; charset=UTF-8], host=[127.0.0.1:8080], pragma=[no-cache],     user-agent=[Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0.1]}
----------------------------

Параметр, который теперь печатается в журнале моим кодом, имеет значение "???? ??"

На сервере, когда я снова получаю контент на болгарском языке, у меня возникает проблема, ниже приведен пример такого ответа.

Encoding: UTF-8
Content-Type: text/xml
Headers: {Accept=[*/*], 

Запрос был отправлен с заголовками выше в соответствии с журналом и wireshark, и ответ:

-----------------------------------------------------------------
ID: 2
Response-Code: 200
Encoding: ISO-8859-1
Content-Type: text/xml
Headers: {Content-Length=[1011], content-type=[text/xml], Server=[IRS/1.0.18.0 guz]}
Payload: <?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:loy="http://www.location.bg/Loyalty/">
<soapenv:Header/>
<soapenv:Body>
<loy:CustLoyaltyResponse>
                <OutputRequestID>SCR0000000394</OutputRequestID>
                <OutputTimeStamp>20120918095649992</OutputTimeStamp>
                <StatusCode>0</StatusCode>
                <StatusMessage>Loyal Customer</StatusMessage>
                <CustomerCode>10122083</CustomerCode>
                <CustomerLoyalStatus>1</CustomerLoyalStatus>
                <LoyalLevel>Special</LoyalLevel>
                <CardObject>
                                <CardStatus>0</CardStatus>
                                <CardCustCode>10122083</CardCustCode>
                                <CardNo>100012624110122083</CardNo>
                                <CardState>4</CardState>
                                <Level>Special</Level>
                                <City>Р?Р°С?РЅР°</City>
                                <Postcode>9000</Postcode>
                                <Address>жк. Чайка</Address>
                                <NameOfRecipient>РўРµС?С? РўРµС?С?</NameOfRecipient>
                                <NumberOfRecipient>12345678</NumberOfRecipient>
                                <LastStatusChangeDate></LastStatusChangeDate>
                </CardObject>
</loy:CustLoyaltyResponse>
</soapenv:Body>
</soapenv:Envelope>
-----------------------------------------------------------------

Проблема видна в

                                <City>Р?Р°С?РЅР°</City>
                            <Address>жк. Чайка</Address>

в то время как в SOAPUI результат правильный

<City>Варна</City>
<Address>жк. Чайка</Address>

Есть мысли в чем проблема и как ее решить?


person Stelios Koussouris    schedule 18.09.2012    source источник


Ответы (2)


Возможно, средства ведения журнала не записывают вывод как UTF-8? Если вы используете log4j, попробуйте добавить

<param name="Encoding" value="UTF-8"/>

к его конфигурации.

person David J. Liszewski    schedule 18.09.2012

В конце концов я посмотрел на свой тип файла журнала, и это был не UTF-8, поэтому я добавил следующее в свой log4j, чтобы сделать его UTF-8

<param name="Encoding" type="UTF-8" /> 

как предложил @unhillbilly. Кроме того, мой редактор (TextPad) не показывает UTF-8, поэтому я переключился на Notepad ++, который он показывает, а также удалив аннотацию @Encoded, я получил «Тест Тест»

Теперь значение правильно извлекается из JAX-RS и передается моему клиентскому адаптеру JAX-WS (все это видно из журнала), а также правильно отправляется в запросе SOAP (loginterceptors показывают это в распечатке запроса SOAP, в то время как тот факт, что внешняя веб-служба теперь отвечает, кажется, подтверждает это).

Request
Address: http://192.168.3.251:4445/WSDL
Encoding: UTF-8
Content-Type: text/xml
Headers: {Accept=[*/*], 
...
<ReceiverName>Тест Тест</ReceiverName>

Остается проблема в том, что когда я получаю ответ, содержащий болгарские символы, и журнал, и клиент REST не получают правильную кодировку символов, однако тот же запрос в пользовательском интерфейсе SOAP приводит к правильному отображению символов.

Проблему можно увидеть в моем журнале, и мой клиент Rest выглядит следующим образом.

<City>Р?Р°С?РЅР°</City>  
<Address>жк. Чайка</Address>  

в то время как в SOAPUI результат правильный

<City>Варна</City>  
<Address>жк. Чайка</Address>  

заголовки ответа, который я получаю, показаны ниже. Я думал, что ISO-8859-1 может повлиять на меня, но опять же, это не объясняет, почему пользовательский интерфейс SOAP обрабатывает его правильно. Насколько я понимаю, я не могу повлиять на кодировку, возвращаемую самой веб-службой из моего канала.

ID: 2 
Response-Code: 200 
Encoding: ISO-8859-1 
Content-Type: text/xml 
Headers: {Content-Length=[1011], content-type=[text/xml], 
Server=[IRS/1.0.18.0 guz]}
Payload: <?xml version="1.0" encoding="UTF-8"?>
person Stelios Koussouris    schedule 19.09.2012
comment
В конце концов я создал веб-службу, издевающуюся над внешней веб-службой, и я возвращаю болгарские символы, которые отлично обрабатываются моей службой. Это связано с правильными настройками атрибутов заголовка Content-Type и Encoding со следующими значениями: Content-Type: text/xml;charset=UTF-8' Encoding: UTF-8 Заголовки, возвращаемые внешней веб-службой, имеют вид Content-Type: text/xml Encoding: ISO-8859-1. - person Stelios Koussouris; 26.09.2012