根据我能找到的内容,我的代码看起来应该是正确的,但是输出的输出并不表示它使用的是FastInfoset。我的理解是Accept应该表明它可以接受Fastinfoset并且响应实际上会使用它,这意味着它不是text / xml作为响应类型。知道我做错了什么吗?我和Google一起搜索过,我很难找到有关如何使用FastInfoset的详细信息。
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.getInInterceptors().add(new LoggingInInterceptor());
factory.getOutInterceptors().add(new LoggingOutInterceptor());
factory.setServiceClass( C360Server.class);
factory.setAddress("http://localhost:8501/cxfcontroller/cl_v5");
C360Server client = (C360Server)factory.create();
((BindingProvider)client).getRequestContext().put(
"com.sun.xml.ws.client.ContentNegotiation", "optimistic");
C360Request requestTrans = new C360Request();
... code to fill in the request ...
C360Response response = client.findContacts( requestTrans );
日志记录似乎并不表示甚至尝试了FastInfoset:
INFO: Outbound Message
---------------------------
ID: 1
Address: http://localhost:8501/cxfcontroller/cl_v5
Encoding: UTF-8
Content-Type: text/xml
Headers: {SOAPAction=[""], Authorization=[Basic cWFfc3VwZXI6cWFfc3VwZXI=], Accept=[*/*]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:findContacts>...bunch of xml deleted for brevity...</ns1:findContacts></soap:Body></soap:Envelope>
--------------------------------------
May 17, 2010 3:23:45 PM org.apache.cxf.interceptor.LoggingInInterceptor logging
INFO: Inbound Message
----------------------------
ID: 1
Response-Code: 200
Encoding: UTF-8
Content-Type: text/xml; charset=utf-8
Headers: {content-type=[text/xml; charset=utf-8], Content-Length=[611], Server=[Jetty(6.1.x)]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:findContactsResponse>...bunch of xml spew deleted for brevity...</ns1:findContactsResponse></soap:Body></soap:Envelope>
--------------------------------------
任何想法我做错了什么?即使服务器不支持FastInfoset,我仍然应该在请求中看到尝试的协商,对吧?
答案 0 :(得分:6)
答案是我有关如何启用它的信息已经过时了。以下工作在客户端(可能是服务器端,但我已经启用了Spring配置来处理它)。
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
// This enables FastInfoset as the communication protocol
factory.getInInterceptors().add( new FIStaxInInterceptor() );
factory.getOutInterceptors().add( new FIStaxOutInterceptor() );
... other code to set username, location, etc. goes here.
client = (C360Server) factory.create();
答案 1 :(得分:0)
//Enabling FastInfoset by configuring proxy
// Enabling FI in pessimistic mode
Map<String, Object> ctxt = ((BindingProvider)proxy).getRequestContext();
ctxt.put(JAXWSProperties.CONTENT_NEGOTIATION_PROPERTY, "pessimistic");
OR
使用系统属性启用FastInfoset
-Dcom.sun.xml.ws.client.ContentNegotiation=pessimistic