2015-11-04 60 views
0

我有一個wsdl客戶端和自動生成類與cxf如何使用cxf在啓動時將基本授權添加到wsdl?

的WSDL的本身需要被存取時基本授權,因此,我以下內容添加到每個BindingPort

Map<String, Object> requestContext = ((BindingProvider)sc).getRequestContext(); 
    requestContext.put(BindingProvider.USERNAME_PROPERTY, userName); 
    requestContext.put(BindingProvider.PASSWORD_PROPERTY, password); 

問題:首先是求值運行Web服務客戶端時。但在此之前,cxf正試圖初始化wsdl服務,並嘗試從url中獲取wsdl。

我該如何獲得基本授權?

Caused by: org.apache.cxf.service.factory.ServiceConstructionException: Failed to create service. 
    at org.apache.cxf.wsdl11.WSDLServiceFactory.<init>(WSDLServiceFactory.java:87) 
    at org.apache.cxf.jaxws.ServiceImpl.initializePorts(ServiceImpl.java:218) 
    at org.apache.cxf.jaxws.ServiceImpl.initialize(ServiceImpl.java:161) 
    ... 58 more 
Caused by: javax.wsdl.WSDLException: WSDLException (at /wsdl:definitions/wsdl:types/xsd:schema): faultCode=PARSER_ERROR: Problem parsing 'https://my.domain.com/MyService'.: java.io.IOException: Server returned HTTP response code: 401 for URL: https://my.domain.com/MyService 
    at com.ibm.wsdl.xml.WSDLReaderImpl.getDocument(WSDLReaderImpl.java:2198) 
    at com.ibm.wsdl.xml.WSDLReaderImpl.parseSchema(WSDLReaderImpl.java:830) 
    at com.ibm.wsdl.xml.WSDLReaderImpl.parseSchema(WSDLReaderImpl.java:654) 
    at com.ibm.wsdl.xml.WSDLReaderImpl.parseTypes(WSDLReaderImpl.java:610) 
    at com.ibm.wsdl.xml.WSDLReaderImpl.parseDefinitions(WSDLReaderImpl.java:320) 
    at com.ibm.wsdl.xml.WSDLReaderImpl.readWSDL(WSDLReaderImpl.java:2352) 
    at com.ibm.wsdl.xml.WSDLReaderImpl.readWSDL(WSDLReaderImpl.java:2338) 
    at org.apache.cxf.wsdl11.WSDLManagerImpl.loadDefinition(WSDLManagerImpl.java:229) 
    at org.apache.cxf.wsdl11.WSDLManagerImpl.getDefinition(WSDLManagerImpl.java:163) 
    at org.apache.cxf.wsdl11.WSDLServiceFactory.<init>(WSDLServiceFactory.java:85) 
    ... 60 more 
Caused by: java.io.IOException: Server returned HTTP response code: 401 for URL: https://my.domain.com/MyService 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1839) 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1440) 
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254) 
    at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:646) 
    at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:189) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:812) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777) 
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141) 
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:243) 
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:348) 
    at com.ibm.wsdl.xml.WSDLReaderImpl.getDocument(WSDLReaderImpl.java:2188) 
    ... 69 more 

回答

1

解決方案從http://cxf.547215.n5.nabble.com/Retrive-WSDL-using-basic-authentication-td5724416.html

public class Authorization { 

    public static void main(String[] args) throws Exception { 
     String wsdl = "http://localhost/WebService/Service?wsdl"; 
     String username = "user"; 
     String password = "password"; 
     String method = "foo"; 

     Bus bus = CXFBusFactory.getThreadDefaultBus(); 
     MyHTTPConduitConfigurer conf = new MyHTTPConduitConfigurer(username, password); 
     bus.setExtension(conf, HTTPConduitConfigurer.class); //important: do not use your implementation class, but the interface 
     JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance(bus); 

     Client client = dcf.createClient(wsdl); 

     Object[] res = client.invoke(method); 

     System.out.println(Arrays.deepToString(res)); 
    } 
} 

class MyHTTPConduitConfigurer implements HTTPConduitConfigurer { 

    private final String username; 
    private final String password; 

    public MyHTTPConduitConfigurer(String username, String password) { 
     this.username = username; 
     this.password = password; 
    } 

    @Override 
    public void configure(String name, String address, HTTPConduit c) { 
     AuthorizationPolicy ap = new AuthorizationPolicy(); 
     ap.setUserName(username); 
     ap.setPassword(password); 
     c.setAuthorization(ap); 
    } 
}