CXF wsdl2java,GZip压缩和存根重用

时间:2013-09-05 03:16:18

标签: cxf gzip wsdl2java

我使用CXF来使用WebService,并且由于响应非常大,我使用gzip“Accept-Encoding”请求并使用GZIPInInterceptor来处理gziped响应。另外我的WSDL非常大(360kb)并且创建存根需要很长时间(+10秒),因为它必须读取和解析WSDL,所以我创建了一次存根并重用它。

问题是,每当我尝试使用两种不同的方法时,第二个请求会给我一个错误,说明它正在等待上一个请求。

为了说明我的问题,我使用这个公共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);

当我尝试接收第二个回复时,我遇到了这个异常: 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

谢谢

1 个答案:

答案 0 :(得分:2)

不要像这样直接设置协议头,而是使用CXF的GZIPOutInterceptor来处理它。

为每个请求重置或重置PROTOCOL标头。当这样设置时,头部映射会在请求通过链时更新。在这种情况下,设置了soapaction。然后在第二个请求中重新发送。

相关问题