2010-06-01 9 views
6

So habe ich keine Ideen mehr zu versuchen, tatsächlich einen Client zu bekommen, um den SOAP-Dienst, den ich durch Achse2 laufen zu verbinden.läuft eine Axis2-Client-Version 1.5

Ich versuchte zwei Methoden, eine war, wsdl2java zu verwenden, um den Stub und die zugehörigen clientseitigen Klassen zu erstellen, und dann eine Clientklasse zu schreiben, die die Anforderungsnachrichten erstellt und sie über den Stub sendet. Der andere Weg, um die ServiceClient zu verwenden war zu verbinden ..

Beide auf ihre eigene Weise versagen ..

Option # 1, jedes Mal, wenn eine Nachricht durch den Stummel gesendet bekomme ich diese zurück:

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, jedes Mal wenn ich es laufen lasse, bekomme ich diese Ausnahme:

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

Option # 2 Quelle:

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

}

+0

Haben Sie das Problem mit Option # 1 gefunden, habe ich das gleiche Problem. – metdos

Antwort

3

Mit dem Vorbehalt, dass Axis2 ist ein buggy pile of crap, ich hatte vor kurzem ein Axis2-Client zu schreiben, und stellte fest, dass der Standard-ServiceClient() Konstruktor nicht gut funktionierte - ich musste manuell ein erstellen ConfigurationContext usw. Ich habe festgestellt, dass die Verwendung von ServiceClient.getOptions() anstelle von new Options() einige Standarddaten beibehalten hat. Ich würde auch empfehlen, die options.setTransportInProtocol(...) fallen zu lassen, wenn Sie es wirklich brauchen - alles sollte ohne HTTP über HTTP gut funktionieren. Möglicherweise müssen Sie auch options.setAction(...) so einstellen, dass sie der "Operation" in Ihrer WSDL entspricht.

Ich habe den Großteil meines Clients (mit sensiblen Informationen abgestreift), in der Hoffnung, dass es helfen wird. Sie können die Teile, die die Adressierung betreffen, wahrscheinlich ignorieren, es sei denn, Sie möchten WS-Adressierung verwenden.

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); 
} 
+2

+1 für Achse2 ist ein Buggy Stapel von Mist – idursun

+0

Unterstützen Sie auch diese Aussage. Offensichtlich haben die Leute Erfolg damit gehabt, aber ich persönlich bin auf Apache CXF mitten in meinen oben genannten Problemen umgezogen und sehe keinen Grund zurück zu schauen. – Rich

5

Ich habe auch den Fehler aufgetreten „Der Eingangsstrom für eine eingehende Nachricht ist null“, während Achse mit zu einem Net Service-Provider zu verbinden.

Das Problem ist, dass. NET nicht unterstützt eine Funktion namens "Chunked Encoding", standardmäßig Axis bricht seine Anfrage Header in Chunks, die eine HTTP 1.1-konforme Sache sein soll.

Wie auch immer, können Sie diese Funktion aktivieren in Achse aus, indem Sie wie folgt vorgehen:

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

Das ist für mich gearbeitet. Eine weitere Sache, die Sie im Umgang mit .Net-Diensten beachten sollten, ist die Möglichkeit, den Anschlussnamen anzugeben und sicherzustellen, dass Ihre Nachrichtennutzlast das Namespace-Präfix für jedes Element hat.

Hoffe diese Info hilft jemandem.

Cheers, DC

1

Wie Danmar sagte

versuchen, den folgenden Code ein: Wert auf true gesetzt ...

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

Hoffe, es funktioniert ...

Dank