所以我试图让客户端连接到我正在通过axis2运行的SOAP服务.
我尝试了两种方法,一种是使用wsdl2java来构建存根和关联的客户端类,然后编写一个Client类来构建请求消息并通过Stub发送它们.另一种方法是使用ServiceClient连接..
两者都以自己的方式失败了..
选项#1,每次通过存根发送消息时我都会回复:
org.apache.axis2.AxisFault: The input stream for an incoming message is null. at org.apache.axis2.transport.TransportUtils.createSOAPMessage(TransportUtils.java:87) at org.apache.axis2.transport.TransportUtils.createSOAPMessage(TransportUtils.java:67) at org.apache.axis2.description.OutInAxisOperationClient.handleResponse(OutInAxisOperation.java:354) at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:417) at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:229) at org.apache.axis2.client.OperationClient.execute(OperationClient.java:165)
选项#2,每次我运行它我得到这个例外:
org.apache.axis2.deployment.DeploymentException: org.apache.axis2.transport.local.LocalTransportSender
选项#2来源:
import javax.xml.stream.XMLStreamException; import org.apache.axiom.om.OMAbstractFactory; import org.apache.axiom.om.OMElement; import org.apache.axiom.om.OMFactory; import org.apache.axiom.om.OMNamespace; import org.apache.axis2.addressing.EndpointReference; import org.apache.axis2.client.Options; import org.apache.axis2.Constants; import org.apache.axis2.client.ServiceClient; public class loyaltyClient { private static EndpointReference targetEPR = new EndpointReference( "http://localhost:8080/axis2/services/service"); public static OMElement verifyCustomer(String customer_id) { OMFactory fac = OMAbstractFactory.getOMFactory(); OMNamespace omNs = fac.createOMNamespace( "http://localhost/","service"); OMElement method = fac.createOMElement("VerifyCustomer",omNs); OMElement value1 = fac.createOMElement("customer_id",omNs); OMElement value2 = fac.createOMElement("source_id",omNs); OMElement value3 = fac.createOMElement("source_password",omNs); OMElement value4 = fac.createOMElement("source_txnid",omNs); OMElement value5 = fac.createOMElement("timestamp",omNs); value1.addChild(fac.createOMText(value1,customer_id)); value2.addChild(fac.createOMText(value2,"source")); value3.addChild(fac.createOMText(value3,"1234")); value4.addChild(fac.createOMText(value4,"123")); value5.addChild(fac.createOMText(value5,"06-01-2010 12:01:01")); method.addChild(value1); method.addChild(value2); method.addChild(value3); method.addChild(value4); method.addChild(value5); return method; } public static void main(String[] args) { try { OMElement vctest = loyaltyClient.verifyCustomer("6177740603"); Options options = new Options(); options.setTo(targetEPR); options.setTransportInProtocol(Constants.TRANSPORT_HTTP); ServiceClient sender = new ServiceClient(); sender.setOptions(options); OMElement result = sender.sendReceive(vctest); String response = result.getFirstElement().getText(); System.out.println(response); } catch (Exception e) { //(XMLStreamException e) { System.out.println(e.toString()); } }
}
解决方法
我还遇到错误“传入消息的输入流为空”,同时使用Axis连接到.Net服务提供商.
问题是.Net不支持称为“分块编码”的功能,默认情况下,Axis将以块为单位中断其请求头,这被认为是符合HTTP 1.1的内容.
// Turn off the Axsis Chunked feature,some service providers (like .Net) don't support chunked headers. Options options = serviceClient.getOptions(); options.setProperty(HTTPConstants.CHUNKED,Constants.VALUE_FALSE); serviceClient.setOptions(options);
这对我有用.在处理.Net服务时要确保的另一件事是能够指定端口名称并确保消息有效负载具有每个元素的名称空间前缀.
希望这些信息有助于某人.
干杯,DC