Alle, Ich versuche, einen Junit-Test zu schreiben, der einen Web-Service-Client in Axis2.1.5 aufruft, und ich bin verwirrt darüber, wie man es genau einrichten kann, um WS-Adressierung zu verwenden.Wie verwende ich die WS-Adressierung in einem Axis2-Client richtig?
Ich habe einen Client-Stub mit wsdl2java generiert, und ich verwende das Repository axis2.xml und Module aus der Binärverteilung axis2.
Ich weiß, ich muss die MemberSubmission-Version der WS-Adressierung verwenden, und ich denke, Ich habe das richtig eingerichtet (mit Optionen), aber die Header scheinen nicht korrekt generiert werden. (Ich sage 'scheine', weil ich nicht herausfinden kann, wie das SOAPMonitor-Modul funktioniert - ich würde auch irgendwelche Tipps dazu begrüßen!).
Meine Hauptverwirrung ist jedoch, was genau benötigt wird, um das Adressierungsmodul zu aktivieren. Sollte es ausreichen, meinen ConfigurationContext mit einer axis2.xml-Datei einzurichten, die einen Verweis auf das Adressierungsmodul hat? So was? :
//standard out of the box axis2 configs
ConfigurationContext myConfigContext = ConfigurationContextFactory
.createConfigurationContextFromFileSystem("C:/devapps/axis2-1.5.1/repository","C:/devapps/axis2-1.5.1/conf/axis2.xml");
Options options = new Options();
EndpointReference targetEPR = new EndpointReference(
"https://host:port/service.asmx");
options.setTo(targetEPR);
//I believe this is what I'm supposed to do to specify the
//MemberSubmission version of WS-Addressing
options.setProperty(AddressingConstants.WS_ADDRESSING_VERSION,
AddressingConstants.Submission.WSA_NAMESPACE);
//No idea of this is needed or not.
options.setProperty(AddressingConstants.INCLUDE_OPTIONAL_HEADERS,
Boolean.TRUE);
options.activate(myConfigContext);
options.setAction("someAction");
CaseDetailsServiceStub stub = new CaseDetailsServiceStub(
"https://host:port/service.asmx");
stub._getServiceClient().setOptions(options);
//I'm calling this from a Junit test
assertNotNull(stub.someAction(someParam));
Mit meinen Optionen wie oben aufgebaut, ist in der Log-Datei, die die Module von axis2.xml geladen werden immer:
[INFO] Deploying module: addressing-1.5.1 - file:/C:/devapps/axis2-1.5.1/repository/modules/addressing-1.5.1.mar
Aber ich glaube nicht, ich bin immer irgendwelche Adressierungsheader. Der Fehler, den ich an dieser Stelle von dem Server wieder sagt:
Kopf http://schemas.xmlsoap.org/ws/2004/08/addressing:Action für ultimative Empfänger erforderlich ist, aber nicht in der Nachricht.
Also habe ich auch einige Dokumente gesehen, die "einnehmende" Module referenzieren. Wenn ich versuche, diese Linie zu meinem Code hinzuzufügen und die Adressierung-1.5.1.mar meinen Classpath hinzufügen, aber:
stub._getServiceClient().engageModule("addressing");
ich eine Fehlermeldung erhalten, die sagt:
kann nicht Modul engagieren: Adressieren org.apache.axis2.AxisFault: Kann Modul engagieren: soapmonitor bei org.apache.axis2.client.ServiceClient.engageModule (ServiceClient.java:358)
Keine andere Informationen oder Stack-Trace in den Protokollen über, das ist aber so, ich bin verwirrt.
Irgendwelche Ideen, was ich falsch mache?
Danke für die Frage, es hat mir sehr geholfen.Für diejenigen, die diesen Code als Beispiel verwenden könnten, möchte ich darauf hinweisen, dass elduff die Submission-Version des WSA-Namespace verwendet hat. Der letzte Namespace ist über AddressingConstants.Final.WSA_NAMESPACE verfügbar. Dies war relevant für mich, als ich versuchte, einen Client für einen JAX-WS 2.1 (Metro) -Server mit Axis 2 1.5.1 zu erstellen. und der Kunde beschwerte sich, dass WSA-Header fehlten. Das Problem wurde durch die Verwendung von Submission.WSA_NAMESPACE im Client als Server Final.WSA_NAMESPACE verursacht. –