2015-05-25 2 views
4

Я создал набор классов с использованием WSDL2Java и создал клиент тестирования, чтобы попытаться вызвать службу SOAP.Исходящее сообщение клиента CXF SOAP имеет пустое тело

Классы сгенерированы, но когда я вызываю веб-службу, я замечаю, что body исходящего сообщения пуст.

Ниже приведена информация о вещах я получил:

Муравья сценарий

<target depends="clear-cxf-client-src" name="cxf-wsdl-java"> 
     <java classname="org.apache.cxf.tools.wsdlto.WSDLToJava" fork="true"> 
     <arg value="-client"/> 
     <arg value="-d"/> 
     <arg value="${src.dir}"/> 
     <arg value="-exsh"/> 
     <arg value="true"/>    
     <arg value="-autoNameResolution"/> 
     <arg value="-wsdlLocation"/> 
     <arg value="${wsdl.url}"/> 
     <arg value="${wsdl.url}"/>    
     <classpath> 
      <path refid="cxf.classpath"/> 
     </classpath> 
     </java> 
    </target> 

Код клиента журнал

URL wsdlURL = Service.WSDL_LOCATION; 
if (args.length > 0 && args[0] != null && !"".equals(args[0])) { 
    File wsdlFile = new File(args[0]); 
    try { 
     if (wsdlFile.exists()) { 
      wsdlURL = wsdlFile.toURI().toURL(); 
     } else { 
      wsdlURL = new URL(args[0]); 
     } 
    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } 
} 

Service service = new Service(); 
ReqServicePortType port = service.getReqServicePort(); 

String endpoint = "http://server:port/<path to end point>"; 
BindingProvider provider = (BindingProvider) port; 
provider.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpoint); 
provider.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "username"); 
provider.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "password"); 
provider.getRequestContext().put("schema-validation-enabled", "true"); 

Client client = ClientProxy.getClient(port); 
LoggingInInterceptor loggingInInterceptor = new LoggingInInterceptor(); 
loggingInInterceptor.setPrettyLogging(true); 
LoggingOutInterceptor loggingOutInterceptor = new LoggingOutInterceptor(); 
loggingOutInterceptor.setPrettyLogging(true); 
client.getInInterceptors().add(loggingInInterceptor); 
client.getOutInterceptors().add(loggingOutInterceptor); 

HTTPConduit http = (HTTPConduit) client.getConduit(); 
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy(); 
httpClientPolicy.setConnectionTimeout(36000); 
httpClientPolicy.setAllowChunking(false); 
http.setClient(httpClientPolicy); 


SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); 
CustomHeader header= new CustomHeader(); 
//setting header value....  
header.setTimestamp(sdf.format(new Date())); 

Holder<CustomHeader> headers = new Holder<CustomHeader>(header); 

ReqDoc reqDoc = new ReqDoc(); 
//setting reqDoc value... 
reqDoc.setTranxId("5"); 

ProcessReq req = new ProcessReq(); 
req.setInput(reqDoc);   

ProcessReqResponse response = port.processReq(req, headers); 

RespDoc respDoc = null; 
if(response != null){ 
    respDoc = response.getOutput(); 
} 

String msgCode = ""; 
String msgDesc = ""; 
if(respDoc != null){ 
    msgCode = respDoc.getMsgCode(); 
    msgDesc = respDoc.getMsgDesc(); 
} 

System.out.println("msgCode: " + msgCode); 
System.out.println("msgDesc: " + msgDesc); 

Исходящего сообщение

INFO: Outbound Message 
--------------------------- ID: 1 Address: http://server:port/<path to service> Encoding: UTF-8 Http-Method: POST Content-Type: text/xml Headers: {Accept=[*/*], Authorization=[Basic 12341323232323=], SOAPAction=["Service_Binder_processReq"]} Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Header> 
    <header xmlns:ns3="http://<my package>" xmlns:ns2="http://<my schema>" xmlns="http://<my schema>"> 
     <timestamp>20150525115746</timestamp> 
    </header> </soap:Header> <soap:Body/> </soap:Envelope> 

Как вы можете видеть, я попытался установить chuking на false, но он все тот же.

Любые комментарии или идеи приветствуются. Благодарю.

ответ

2

Было обнаружено, что это происходит, когда вы запускаете сгенерированный клиентский класс без ссылки на файлы куба CXF Lib. После добавления их в путь к классам генерируется тело сообщения.

+0

Я также сталкиваюсь с аналогичной проблемой. Но в моем случае я не использую CXF, я использую JAXB-клиент. Есть ли у вас какие-либо идеи, что может быть проблемой? – dev

1

В моем случае мыло было пустым из-за различных версий cxf-банок на пути к классам. Я использую camel-cxf 2.5.3, который зависит от cxf версии 3.0.6. Я ошибочно включил версию cxf-rt-transports-http-jetty 3.1.1 в своем сценарии с градиентом, который добавил 3.1.1 cxf-core, и это вызвало проблему с пустым мылом. Поместив версию 3.0.6 для cxf-rt-transports-http-jetty, исправлена ​​проблема, и теперь тело правильно заполнено.

Смежные вопросы