2016-04-08 19 views
0

Ich versuche, einen SOAP-Webservice mit Spring-ws zu konsumieren. Ich kann diesen Webdienst erfolgreich über die SOAP-Benutzeroberfläche verwenden. Ich erhalte jedoch eine nicht autorisierte Ausnahme:Consuming SOAP WS gibt Fehler 401 nicht autorisiert

org.springframework.ws.client.WebServiceTransportException: Unauthorized [401] 
    at org.springframework.ws.client.core.WebServiceTemplate.handleError(WebServiceTemplate.java:699) 

Wie kann ich erfolgreich authentifizieren?

Mein Code ist wie folgt:

WebServiceTemplate Konfiguration:

@Bean 
    public WebServiceTemplate webServiceTemplate(Jaxb2Marshaller marshaller){ 
     WebServiceTemplate webServiceTemplate = new WebServiceTemplate(); 
     webServiceTemplate.setDefaultUri("http://ultron.illovo.net:9704/AdminService"); 
     webServiceTemplate.setMarshaller(marshaller); 
     webServiceTemplate.setUnmarshaller(marshaller); 

     Credentials credentials = new UsernamePasswordCredentials("biqa", "welcome1"); 

     HttpComponentsMessageSender messageSender = new HttpComponentsMessageSender(); 
     messageSender.setCredentials(credentials); 
     messageSender.setReadTimeout(5000); 
     messageSender.setConnectionTimeout(5000); 
     webServiceTemplate.setMessageSender(messageSender); 

     return webServiceTemplate; 
    } 

Auftraggeber:

@Autowired 

WebServiceTemplate webServiceTemplate; 

public CallProcedureWithResultsResponse callProcedureWithResults(String procedureName){ 
    CallProcedureWithResults request = new CallProcedureWithResults(); 
    request.setProcedureName(procedureName); 
    log.info("Calling procedure " + procedureName); 

    CallProcedureWithResultsResponse response = (CallProcedureWithResultsResponse) webServiceTemplate.marshalSendAndReceive("http://ultron.illovo.net:9704/AdminService/AdminService", request); 

    return response; 
} 

JUnit-Test

@Test 
    public void testWebService(){ 
     AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ObieeConfiguration.class); 
     ObieeClient client = context.getBean(ObieeClient.class); 
     CallProcedureWithResultsResponse response = client.callProcedureWithResults("GetOBISVersion()"); 
     client.printResponse(response); 
     context.close(); 
    } 
+0

Haben Sie das jemals behoben? Wenn ja, was war Ihre Lösung? – mattalxndr

Antwort

1

ich es geschafft, dieses Problem zu beheben, indem Sie folgendermaßen vorgehen:

eine Unterklasse von HttpUrlConnectionMessageSender Erstellen Sie wie folgt vor:

public class WebServiceMessageSenderWithAuth extends HttpUrlConnectionMessageSender { 

    String user; 
    String password; 

    public WebServiceMessageSenderWithAuth(String user, String password) { 
     this.user = user; 
     this.password = password; 
    } 

    @Override 
    protected void prepareConnection(HttpURLConnection connection) throws IOException { 
     BASE64Encoder enc = new BASE64Encoder(); 
     String userpassword = user+":"+password; 
     String encodedAuthorization = enc.encode(userpassword.getBytes()); 
     connection.setRequestProperty("Authorization", "Basic " + encodedAuthorization); 
     super.prepareConnection(connection); 
    } 

} 

Mein Kunde ist wie folgt definiert:

public class ObieeClient extends WebServiceGatewaySupport { 

    private static final Logger log = LoggerFactory.getLogger(ObieeClient.class); 

    public CallProcedureWithResultsResponse callProcedureWithResults(String procedureName, String webServiceURL){ 
     CallProcedureWithResults request = new CallProcedureWithResults(); 
     request.setProcedureName(procedureName); 
     log.info("Calling procedure " + procedureName); 

     CallProcedureWithResultsResponse response = (CallProcedureWithResultsResponse) ((JAXBElement) getWebServiceTemplate().marshalSendAndReceive(webServiceURL, request)).getValue(); 

     return response; 
    } 
} 

Und Schließlich ist der Client so konfiguriert, dass er die Anmeldeinformationen verwendet, indem er den Absender der Nachricht festlegt:

 Jaxb2Marshaller marshaller = new Jaxb2Marshaller();   marshaller.setContextPath("za.co.adaptit.smartdeployment.webservices.wsdl"); 

       //set up web service client 
       ObieeClient client = new ObieeClient(); 
       client.setDefaultUri(host); 
       client.setMarshaller(marshaller); 
       client.setUnmarshaller(marshaller); 
       client.setMessageSender(new WebServiceMessageSenderWithAuth("user", "password")); 

response = client.callProcedureWithResults("NQSModifyMetadata('" + obieeObjectsXML +"')", server.getHost()); 

Hoffe das hilft.

0

Ich laufe auf das gleiche Problem und verwaltet zu lösen, indem ich einen MessageSender mit Credentials definieren und dann auf den Client setzen. Ich musste keinen benutzerdefinierten MessageSender erstellen.

@Bean 
public WebServiceMessageSender messageSender(Credentials credentials) throws Exception{ 
    HttpComponentsMessageSender messageSender = new HttpComponentsMessageSender(); 
    messageSender.setCredentials(credentials); 
    return messageSender; 
} 

@Bean 
public Credentials credentials(){ 
    UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(USERNAME, PASSWORD); 
    return credentials; 

} 
0

Verwenden Sie HttpsUrlConnectionMessageSender für sichere HTTP-Verbindungen. Dies ist Teil der Abhängigkeit von der Frühjahrs-Unterstützung. Außerdem können Sie verschiedene Zertifikatsprobleme umgehen, indem Sie HttpsUrlConnectonMessageSender verwenden, wie das falsche Übereinstimmungszeichen für den gemeinsamen Namen des Zertifikats.

Verwenden Sie nicht BASE64Encoder, es ist die Klasse von sun.misc Glas, die nicht sehr sicher ist. Verwenden Sie Base64 von Java-Util in Java 1.8 und Base64 von Apache für Java-Version weniger als Java 1.8

public class WebServiceMessageSenderWithAuth extends HttpsUrlConnectionMessageSender { 

String user; 
String password; 

public WebServiceMessageSenderWithAuth(String user, String password) { 
    this.user = user; 
    this.password = password; 
    } 

@Override 
protected void prepareConnection(HttpURLConnection connection) throws IOException { 

    String userpassword = user+":"+password; 
    String encodedAuthorization = Base64.encode(userpassword.getBytes()); 
    connection.setRequestProperty("Authorization", "Basic " + encodedAuthorization); 
    //set various properties by using reference of connection according to your requirement 
    } 
} 
Verwandte Themen