我的问题是2倍,它与编码有关。我在JBoss 7.1.1上部署了一个REST Web应用程序。这有一个外部Web服务的适配器,我已经从提供的WSDL中使用CXF java2wsdl创建了存根。在请求/响应此外部Web服务请求期间回复可以包含保加利亚语编码内容。
问题在于,我的REST服务以及来自SOAPUI的SOAP适配器未正确发送/使用此编码内容。以下是一个例子
REST CALL将参数“ТестТест”传递为
@PathParam(“receiverName”)String receiverName
标题包含 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通过上面的Headers发送的,响应是:
-----------------------------------------------------------------
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>
任何想法是什么问题以及如何解决它?
答案 0 :(得分:2)
可能是日志工具没有将输出记录为UTF-8
吗?如果您使用的是log4j
,请尝试添加
<param name="Encoding" value="UTF-8"/>
到它的配置。
答案 1 :(得分:1)
最后我查看了我的日志文件类型并且它不是UTF-8因此我将以下内容添加到我的log4j中以使其成为UTF-8
<param name="Encoding" type="UTF-8" />
正如@unhillbilly所建议的那样。另外,我的编辑器(TextPad)没有显示UTF-8,所以我交换到它所做的Notepad ++,同时删除@Encoded注释,我得到了“ТестТест”
现在从JAX-RS正确检索该值并将其传递给我的JAX-WS客户端适配器(日志显示的所有方式),并且它也在SOAP请求中正确发送(loginterceptors在打印输出中显示此信息) SOAP请求,而外部Web服务现在回复的事实似乎证实了它)。
Request
Address: http://192.168.3.251:4445/WSDL
Encoding: UTF-8
Content-Type: text/xml
Headers: {Accept=[*/*],
...
<ReceiverName>Тест Тест</ReceiverName>
剩下的问题是,当我收到包含保加利亚字符的响应时,日志和REST客户端都没有获得正确的字符编码,但SOAP UI中的相同请求会导致正确的字符显示
问题可以在我的日志中看到,我的Rest Client是以下
<City>Р?Р°С?РЅР°</City>
<Address>жк. Чайка</Address>
虽然在SOAPUI中结果是正确的
<City>Варна</City>
<Address>жк. Чайка</Address>
我收到的回复标题如下所示。我认为ISO-8859-1可能会影响我,但是它再次确实说明了为什么SOAP UI正确处理它。据我所知,我不能影响Web服务本身从我的管道返回的编码。
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"?>