running an axis2 client version 1.5
Asked Answered
J

2

6

So I'm running out of ideas to try to actually get a client to connect to the SOAP service I'm running through axis2.

I tried two methods, one was to use wsdl2java to build the stub and associated client side classes, and then write a Client class that build the requests messages and sends them through the Stub. The other way was to use the ServiceClient to connect..

Both are failing in their own way..

Option #1, every time a message is sent through the stub I get this back:

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)

Option #2, everytime I run it I get this Exception:

org.apache.axis2.deployment.DeploymentException: org.apache.axis2.transport.local.LocalTransportSender

Option #2 source:

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());
        }
    }

}

Jalbert answered 1/6, 2010 at 21:40 Comment(1)
Did you find the problem with Option #1, I have the same issue.Sheply
A
5

I've also encountered the error "The input stream for an incoming message is null" while using Axis to connect to a .Net service provider.

The problem is that .Net doesn't not support a feature called "chunked encoding", by default Axis will break its request header in chunks which is suppose to be a HTTP 1.1 compliant thing.

Anyway, you can turn this feature off in Axis by doing the following:

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

This worked for me. Another thing to make sure of when dealing with .Net services is to be able to specify the port name and make sure your message payload has the namespace prefix for each element.

Hope this info helps somebody.

Cheers, DC

Alabaster answered 16/1, 2012 at 11:43 Comment(0)
S
3

With the caveat that Axis2 is a buggy pile of crap, I recently had to write an Axis2 client, and found that using the default ServiceClient() constructor didn't work well -- I had to manually create a ConfigurationContext, etc. I found that using ServiceClient.getOptions() instead of creating new Options() preserved some default data. I'd also recommend dropping the options.setTransportInProtocol(...) unless you really need it -- everything should work fine via HTTP without this. Also, you may need to set options.setAction(...) to correspond with the "operation" in your WSDL.

I've included the bulk of my client (with sensitive information stripped out), in hopes that it will help. You can probably safely ignore the portions regarding addressing unless you plan to use 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, e.g. 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);
}
Sparks answered 8/6, 2010 at 15:43 Comment(1)
Also support that statement. Obviously people have found success with it, but I personally moved onto Apache CXF in the midst of my problems above and don't see a reason to look back.Jalbert

© 2022 - 2024 — McMap. All rights reserved.