Jax-WS Axis2-Proxy über SSL-Fehler mit ProxySelector

8

In meinem Projekt habe ich die folgende Projektstruktur:

Ich habe ein Modul, das eine WAR-Datei erstellt und in einem Tomcat-Anwendungsserver bereitgestellt werden kann. Dieses Modul besitzt Abhängigkeiten zu Axis2-Bibliotheken:

%Vor%

Und diese Klasse enthält eine axis2.xml-Datei im Ordner conf unter WEB-INF.

Jetzt hat dieses Modul eine Abhängigkeit von einem Unit-Modul, das den Pakettyp eines Jars hat.

Jetzt in meinem Web-Modul, im Code für meinen Stub habe ich folgenden Code:

GazelleObjectValidator.getInstance (). validateObject ();

Der XcpdValidationService ist eine Klasse im JAR-Modul (Abhängigkeit), und diese Methode ruft einen externen Webdienst über SSL und einen Proxy auf.

Dieser Web-Service-Client wird von JAX WS RI generiert

ABER diese Klasse verwendet nicht die axis2.xml-Konfiguration vom übergeordneten Modul und verwendet ihre eigene Achsenkonfiguration, die die Standardkonfiguration ist, in der mein Proxy nicht konfiguriert ist ...

%Vor%

Die Methode selbst sieht so aus:

%Vor%

Mein GazelleObjectValidatorService wird mit folgendem Plugin generiert:

%Vor%

Ich habe versucht, den transportSender in meiner axis2.xml-Konfiguration mit meinem eigenen definierten MyCommonsHttpTransportSender zu überschreiben:

%Vor%

und

%Vor%

das den Proxy kennt.

aber leider, da der Web-Service-Client in der jar, die eine Abhängigkeit des Krieges ist, scheint es nicht meine axis2.xml-Konfiguration verwenden, sondern verwendet seine eigene Achse Konfiguration, die nicht über den Proxy weiß .

Dies verursacht den folgenden Fehler, wenn Sie klar sehen, dass es den Standard CommonsHTTPTransportSender verwendet und daher den Fehler verursacht:

%Vor%

Gibt es eine Möglichkeit, den WS-Client im Kind-Jar die gleiche axis2-Konfiguration des Eltern-Moduls nutzen zu lassen (das ist ein bereitstellbarer Krieg und hat die axis2-Abhängigkeiten?)

UPDATE:

Meine WAR-Datei hat eine axis2-Konfiguration, aus dem Quellcode dieses Krieges wird ein mit wsimport generierter Dienst aufgerufen, der sich in einer JAR befindet, die eine Abhängigkeit von der übergeordneten WAR ist. Dieser Dienst ruft einen externen WebService auf, und zwar über Axis (obwohl die Konfigurationsdatei axis2.xml nicht verwendet wird, da sich diese im WEB-INF-Ordner des JAR befindet. Wäre es nicht möglich, den externen WebService-Aufruf in der JAR ohne Axis auszuführen und nur JAXWS zu verwenden? Dies würde meine Probleme lösen ...

    
Mathias Ghys 30.08.2017, 15:41
quelle

1 Antwort

2

Axis2 bietet eine bequeme Methode, den HTTP-Transport zu konfigurieren . Folgen Sie Ihrem Beispielcode:

%Vor%

Das obige würde für Sie nicht funktionieren, weil Sie die JAX-WS-Implementierung verwenden, nicht der Axis2-spezifische Client . Auf der Grundlage Ihres Stacktrace scheint es, dass Sie eine Verbindung zu einem TLS-gesicherten Endpunkt herstellen. Dafür gibt es eine Lösung

Ich habe viel recherchiert, und es gibt keinen Zugriff auf die zugrunde liegende HTTPUrlConnection mit Lager JAX-WS. Was wir haben, ist eine Möglichkeit, eine benutzerdefinierte SSLContextFactory . Wir beginnen mit der Erstellung einer benutzerdefinierten Factory, die zuerst eine Verbindung zum Proxy herstellt :

%Vor%

Wir registrieren nun diese benutzerdefinierte Socket-Factory mit der Apache HTTPClient-Laufzeit (Axis verwendet not die Standard-Java-HTTPUrlConnection, wie dies von Ihrem Stacktrace belegt wird):

%Vor%

Dies funktioniert nur für TLS-Verbindungen. (Eine benutzerdefinierte Socket-Factory kann jedoch auch auf Nicht-HTTPS-Endpunkte angewendet werden). Außerdem müssen Sie das Zeitlimit auf 0 setzen damit wir garantieren können, dass Ihr überschrieben% code_de% aufgerufen wird

    
kolossus 06.09.2017 17:25
quelle