运行axis2客户端版本1.5

所以我试图让客户端连接到我正在通过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不支持称为“分块编码”的function,默认情况下,Axis将以块为单位中断其请求头,这被认为是符合HTTP 1.1的内容。

无论如何,您可以通过执行以下操作在Axis中关闭此function:

 // 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

有一点需要注意, Axis2是一堆垃圾 ,我最近不得不写一个Axis2客户端,发现使用默认的ServiceClient()构造函数不能正常工作 – 我不得不手动创建一个ConfigurationContext等。我发现使用ServiceClient.getOptions()而不是创建new Options()保留了一些默认数据。 我还建议删除options.setTransportInProtocol(...)除非你真的需要它 – 一切都应该通过HTTP没有这个工作正常。 此外,您可能需要将options.setAction(...)设置为与WSDL中的“operation”相对应。

我已经包含了我的大部分客户端(敏感信息被删除),希望它会有所帮助。 除非您打算使用WS-Addressing,否则您可以安全地忽略有关寻址的部分。

 ConfigurationContext cfgCtx = null; try { /* Passing null to both params causes an AxisConfiguration to be created that uses * the default axis2.xml file, which is included in the axis2 distribution jar. * This is ideal for our case, since we cannot pass a full file path (relative * paths are not allowed) because we do not know where the customer will deploy * the application. This also allows engaging modules from the classpath. */ cfgCtx = ConfigurationContextFactory.createConfigurationContextFromFileSystem(null , null); } catch (AxisFault e) { // Bubble up the error } ServiceClient svcClient = null; try { svcClient = new ServiceClient(cfgCtx, null); } catch (AxisFault e) { // Bubble up the error } try { /* This will work with the above ConfigurationContext as long as the module * (addressing-1.5.1.mar) is on the classpath, eg in shared/lib. */ svcClient.engageModule("addressing"); } catch (AxisFault e) { // Bubble up the error } Options opts = svcClient.getOptions(); opts.setTo(new EndpointReference("http://myservername:8080/axis2/services/MyService")); opts.setAction("urn:doSomething"); // Corresponds to the "operation" in MyService's WSDL opts.setSoapVersionURI(SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI); // Set output to SOAP 1.2 SOAPFactory factory = OMAbstractFactory.getSOAP12Factory(); svcClient.addHeader(createSOAPSecurityHeader(factory, response)); // CreateSOAPHeader just creates an OMElement try { svcClient.sendReceive(createSOAPBody(factory, response)); // CreateSOAPBody just creates an OMElement } catch (AxisFault e) { throw new ResponseDeliveryException(1, "Error sending SOAP payload.", e); } 

正如丹马尔所说,

尝试以下代码:value设置为true …

 Options options = serviceClient.getOptions(); options.setProperty(HTTPConstants.CHUNKED, Constants.VALUE_TRUE); serviceClient.setOptions(options); 

希望它有效……

谢谢

我在WSDL存​​根调用“operationClient.execute()”上遇到此错误。 此调用,重定向到调用调用(为连接和发送数据定制)

 org.apache.axis2.AxisFault: The input stream for an incoming message is null. at org.apache.axis2.transport.TransportUtils.createSOAPMessage(TransportUtils.java:91) at org.apache.axis2.transport.TransportUtils.createSOAPMessage(TransportUtils.java:66) at org.apache.axis2.description.OutInAxisOperationClient.handleResponse(OutInAxisOperation.java:347) at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:414) at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:225) at org.apache.axis2.client.OperationClient.execute(OperationClient.java:150)