私は CXF を使用して WebService を消費していますが、応答が非常に大きいため、gzip の「Accept-Encoding」で要求し、GZIPInInterceptor を使用して gzip された応答を処理しています。また、私の WSDL は非常に大きく (360kb)、WSDL を読み取って解析する必要があるため、スタブの作成に長い時間 (+10 秒) かかります。そのため、スタブを一度作成して再利用しています。
問題は、2 つの異なるメソッドを使用しようとするたびに、2 番目のリクエストで前のリクエストが必要であるというエラーが表示されることです。
私の問題を説明するために、このパブリック WebService を使用して簡単な例を作成しました。
http://www.webservicex.net/BibleWebservice.asmx?WSDL
GZip 圧縮がなければ正常に動作します。
BibleWebserviceSoap bibleService = new BibleWebservice().getBibleWebserviceSoap();
String title = bibleService.getBookTitles();
response.getWriter().write(title);
String johnResponse = bibleService.getBibleWordsbyKeyWord("John");
response.getWriter().write(johnResponse);
両方の応答を受け取ることができます。Gzip 圧縮を有効にします。
BibleWebserviceSoap bibleService = new BibleWebservice().getBibleWebserviceSoap();
//GZIP compression on bibleService
Client client = ClientProxy.getClient(bibleService);
client.getInInterceptors().add(new GZIPInInterceptor());
client.getInFaultInterceptors().add(new GZIPInInterceptor());
// Creating HTTP headers
Map<String, List<String>> headers = new HashMap<String, List<String>>();
headers.put("Accept-Encoding", Arrays.asList("gzip"));
// Add HTTP headers to the web service request
client.getRequestContext().put(Message.PROTOCOL_HEADERS, headers);
String title = bibleService.getBookTitles();
response.getWriter().write(title);
String johnResponse = bibleService.getBibleWordsbyKeyWord("John");
response.getWriter().write(johnResponse);
2 番目の応答を受信しようとすると、次の例外が発生します。
org.apache.cxf.interceptor.Fault: Unexpected wrapper element {http://www.webserviceX.NET}GetBookTitlesResponse found. Expected {http://www.webserviceX.NET}GetBibleWordsbyKeyWordResponse.
私の実際のアプリケーションでは、リクエストで例外が発生します。
org.apache.cxf.binding.soap.SoapFault: OperationFormatter encountered an invalid Message body. Expected to find node type 'Element' with name 'GetAvailabilityRequest' and namespace 'http://schemas.navitaire.com/WebServices/ServiceContracts/BookingService'. Found node type 'Element' with name 'ns4:PriceItineraryRequest' and namespace 'http://schemas.navitaire.com/WebServices/ServiceContracts/BookingService'
私のサンプル プロジェクトはここからダウンロードできます: http://www.sendspace.com/file/plt0m4
ありがとうございました