3

私の問題は2つあり、エンコードに関係しています。JBoss 7.1.1 にデプロイされた REST Web アプリケーションがあります。これには、提供された WSDL から CXF java2wsdl を使用してスタブを作成した外部 Web サービスへのアダプターがあります。この外部 Web サービスへの要求/応答中に、要求と応答にブルガリア語でエンコードされたコンテンツが含まれる場合があります。

問題は、このエンコードされたコンテンツが、SOAPUI からのものであるにもかかわらず、REST サービスや SOAP アダプターによって正しく送信/消費されないことです。以下は例です

REST CALL は、パラメーター「Тест Тест」を次のように渡します。

@PathParam("receiverName") 文字列 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によると、リクエストは上記のヘッダーで送信され、レスポンスは次のとおりです。

-----------------------------------------------------------------
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>жк. Чайка&lt;/Address>
                                <NameOfRecipient>РўРµС?С? РўРµС?С?</NameOfRecipient>
                                <NumberOfRecipient>12345678</NumberOfRecipient>
                                <LastStatusChangeDate></LastStatusChangeDate>
                </CardObject>
</loy:CustLoyaltyResponse>
</soapenv:Body>
</soapenv:Envelope>
-----------------------------------------------------------------

この問題は、

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

一方、SOAPUI では結果は正しい

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

問題が何であり、それを解決する方法はありますか?

4

2 に答える 2

2

ロギング機能が出力を として記録していない可能性がありUTF-8ますか? を使用している場合はlog4j、追加してみてください

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

その構成に。

于 2012-09-18T22:29:33.150 に答える
1

最後にログファイルのタイプを調べたところ、UTF-8 ではなかったので、log4j に以下を追加して UTF-8 にしました。

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

@unhillbilly の提案どおり。さらに、私のエディター (TextPad) は UTF-8 を表示しないので、それが表示される Notepad++ に交換し、@Encoded アノテーションも削除することで、「Тест Тест」を取得しました。

これで、値が JAX-RS から正しく取得され、JAX-WS Client Adapter に渡され (ログに示されているすべての方法で)、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>жк. Чайка&lt;/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"?>
于 2012-09-19T09:11:16.127 に答える