JAX-WS-client kann nicht authentifizieren
Ich versuche zu verbrauchen eine sichere (HTTPS-schema) web-service mit Hilfe der standard JAVA 7 JAX-WS-tools.
Dieser web service erfordert eine Authentifizierung.
Habe ich bereits erfolgreich Hinzugefügt Zertifikat auf meinem lokalen java-keystore.
Alle benötigten Klassen habe ich generiert aus der WSDL-Datei, mit Hilfe von wsimport
tool.
Nun, ich bin versucht, folgenden Aufruf führen Sie einen einfachen test:
public class ReportingWebServiceTest {
static ReportingServiceService service;
static ReportingService port;
@BeforeClass
public static void setUpBeforeClass(){
service = new ReportingServiceService();
port = service.getReportingServicePort();
Map<String, Object> rContext = ((BindingProvider) port).getRequestContext();
Map<String, List<String>> headers = new HashMap<String, List<String>>();
headers.put("Authorization", Collections.singletonList("Basic YWRtaW5AYWRhcHRsb2dpYy5jb206MTIxMjE****="));
// headers.put("Username", Collections.singletonList("*****@******.com"));
// headers.put("Password", Collections.singletonList("********"));
rContext.put(MessageContext.HTTP_REQUEST_HEADERS, headers);
// rContext.put(BindingProvider.USERNAME_PROPERTY, "*****@******.com");
// rContext.put(BindingProvider.PASSWORD_PROPERTY, "********");
}
@Test
public void test() {
WEBCAMPAIGNROW row = port.getCampaignRowById(14081);
toConsole(row.toString());
}
protected static void toConsole(String msg) {
System.out.println(msg);
}
}
Wenn ich den test ausführen, es gibt mir folgende Ausnahme:
javax.xml.ws.WebServiceException: Failed to access the WSDL at: https://reporting-stage.admp.mtv3.adtlgc.com/admp/ReportingService?wsdl. It failed with:
Got Server returned HTTP response code: 401 for URL: https://reporting-stage.admp.mtv3.adtlgc.com/admp/ReportingService?wsdl while opening stream from https://reporting-stage.admp.mtv3.adtlgc.com/admp/ReportingService?wsdl.
at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.tryWithMex(RuntimeWSDLParser.java:173)
at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:155)
at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:120)
at com.sun.xml.internal.ws.client.WSServiceDelegate.parseWSDL(WSServiceDelegate.java:257)
at com.sun.xml.internal.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:220)
at com.sun.xml.internal.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:168)
at com.sun.xml.internal.ws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:96)
at javax.xml.ws.Service.<init>(Service.java:77)
at com.enreach.admp.reporting.ReportingServiceService.<init>(ReportingServiceService.java:42)
at me.enreach.automation.mtv3.ReportingWebServiceTest.setUpBeforeClass(ReportingWebServiceTest.java:26)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.io.IOException: Got Server returned HTTP response code: 401 for URL: https://reporting-stage.admp.mtv3.adtlgc.com/admp/ReportingService?wsdl while opening stream from https://reporting-stage.admp.mtv3.adtlgc.com/admp/ReportingService?wsdl
at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.createReader(RuntimeWSDLParser.java:842)
at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.resolveWSDL(RuntimeWSDLParser.java:283)
at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:140)
... 23 more
Caused by: java.io.IOException: Server returned HTTP response code: 401 for URL: https://reporting-stage.admp.mtv3.adtlgc.com/admp/ReportingService?wsdl
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1626)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
at java.net.URL.openStream(URL.java:1037)
at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.createReader(RuntimeWSDLParser.java:827)
... 25 more
Wie Sie sehen, habe ich versucht zu verwenden drei verschiedene Techniken der Authentifizierung, aber ohne Glück. Ausnahme ist die gleiche in allen drei Fällen.
Was mache ich falsch?
P. S. wenn ich versuche, Zugriff auf WSDL im browser die Anmeldeinformationen, die ich in der code funktionieren einwandfrei.
- Ich habe auch versucht Authenticator.setDefault(.......) Ansatz, und es hilft auch nicht mir.
- Auch wissen Sie, welche Art der Authentifizierung benötigt wird?
- NÖ, ich bin nicht sicher, welche Art von Authentifizierung erforderlich. Aber wie Sie sehen können habe ich bereits versucht, auf alle Arten, die ich bisher gefunden habe.
- Sie könnten versuchen sich auf einen der beiden Vorschläge?
- Die Authentifizierung muss die HTTP-Basic-Authentifizierung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dein Problem ist nicht im Zusammenhang mit SSL-Zertifikat. Ihre Frage ist in Bezug auf die Authentifizierung. Service-Instanz müssen in der Lage sein, um Zugriff auf WSDL-Inhalte (vor Ihrer stub invoke eigentlichen web-Methode), aber Es ist fehlgeschlagen, das ist, warum Sie bekam den Fehler zu finden.
Sie haben 2 Lösungen:
Registrieren default Authenticator:
Download WSDL-Dokument, und speichern Sie es auf einen LOKALEN Speicher, dann verwenden Sie die lokale WSDL-Datei.
Für diese Lösung, müssen Sie erstellen Dienst-Instanz, NICHT verwenden generierten code, wie Sie es Tat.
Können versuchen, ein paar Dinge:
1.) Wissen Sie, welche Art der Authentifizierung der server erwartet?
2.) Wenn Sie versuchen, Zugriff https://reporting-stage.admp.mtv3.adtlgc.com/admp/ReportingService?wsdl kannst du etwas sehen? z.B. ich nehme an, es ist eine IP-Whitelist, oder etwas und Sie Anmeldeinformationen eingeben dort oder ähnliches? Weil ich cant nichts zu sehen gibt.
3.) Wenn es um den code, den ich authentifizieren, um einen gesicherten webservice über HTTP auf diese Weise:
Festgelegt über Endpunkt propertie auf was gespeichert ist in Ihrer wsdl-s wsdl:port... Teil, die ich erwarten in etwa so Aussehen (und sollte der Standard sein...):
Bearbeiten:
Den
wird verwendet, um die Ziel-Endpunkt zur Laufzeit. Also, wenn der webservice hat einen anderen Endpunkt als die in der wsdl-stellen Sie sicher, dass es auf den tatsächlichen Endpunkt auf diese Weise.