2013-01-16 77 views
0

我被提供了這個WSDL,我必須爲它開發一個客戶端(我一直在這裏提出關於它的問題)。在Web服務客戶端中設置用戶名和密碼的位置?

<?xml version="1.0" encoding="UTF-8"?> 
<wsdl:definitions targetNamespace="urn:ManterFornecedor" xmlns:s0="urn:ManterFornecedor" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <wsdl:types> 
    <xsd:schema elementFormDefault="qualified" targetNamespace="urn:ManterFornecedor"> 
     <xsd:element name="Novo" type="s0:InputMapping1"/> 
     <xsd:complexType name="InputMapping1"> 
      <xsd:sequence> 
       <xsd:element name="NO_FORNECEDOR" type="xsd:string"/> 
       <xsd:element name="DE_CONTRATO" type="xsd:string"/> 
       <xsd:element name="DH_INICIO" nillable="true" type="xsd:dateTime"/> 
       <xsd:element name="DH_FIM" nillable="true" type="xsd:dateTime"/> 
       <xsd:element name="NO_PRODUTO" type="xsd:string"/> 
       <xsd:element name="IC_STATUS" type="s0:IC_STATUSType" nillable="true"/> 
      </xsd:sequence> 
     </xsd:complexType> 
     <xsd:simpleType name="IC_STATUSType"> 
      <xsd:restriction base="xsd:string"> 
       <xsd:enumeration value="Ativo"/> 
       <xsd:enumeration value="Inativo"/> 
      </xsd:restriction> 
     </xsd:simpleType> 
     <xsd:element name="NovoResponse" type="s0:OutputMapping1"/> 
     <xsd:complexType name="OutputMapping1"> 
     <xsd:sequence> 
      <xsd:element name="Id" type="xsd:string"/> 
     </xsd:sequence> 
     </xsd:complexType> 
     <xsd:element name="AuthenticationInfo" type="s0:AuthenticationInfo"/> 
     <xsd:complexType name="AuthenticationInfo"> 
     <xsd:sequence> 
      <xsd:element name="userName" type="xsd:string"/> 
      <xsd:element name="password" type="xsd:string"/> 
      <xsd:element minOccurs="0" name="authentication" type="xsd:string"/> 
      <xsd:element minOccurs="0" name="locale" type="xsd:string"/> 
      <xsd:element minOccurs="0" name="timeZone" type="xsd:string"/> 
     </xsd:sequence> 
     </xsd:complexType> 
    </xsd:schema> 
    </wsdl:types> 

    <wsdl:message name="NovoSoapOut"> 
     <wsdl:part element="s0:NovoResponse" name="parameters"></wsdl:part> 
    </wsdl:message> 

    <wsdl:message name="ARAuthenticate"> 
     <wsdl:part element="s0:AuthenticationInfo" name="parameters"></wsdl:part> 
    </wsdl:message> 

    <wsdl:message name="NovoSoapIn"> 
     <wsdl:part element="s0:Novo" name="parameters"></wsdl:part> 
    </wsdl:message> 

    <wsdl:portType name="PortPortType"> 
     <wsdl:operation name="Novo"> 
     <wsdl:input message="s0:NovoSoapIn"></wsdl:input> 
     <wsdl:output message="s0:NovoSoapOut"></wsdl:output> 
     </wsdl:operation> 
    </wsdl:portType> 

    <wsdl:binding name="PortSoapBinding" type="s0:PortPortType"> 
     <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> 
     <wsdl:operation name="Novo"> 
      <soap:operation soapAction="urn:ManterFornecedor/Novo" style="document"/> 
      <wsdl:input> 
       <soap:header message="s0:ARAuthenticate" part="parameters" use="literal"></soap:header> 
       <soap:body use="literal"/> 
      </wsdl:input> 
      <wsdl:output> 
       <soap:body use="literal"/> 
      </wsdl:output> 
     </wsdl:operation> 
    </wsdl:binding> 

    <wsdl:service name="ManterFornecedorService"> 
     <wsdl:documentation>Fornecedor</wsdl:documentation> 
     <wsdl:port binding="s0:PortSoapBinding" name="PortSoap"> 
      <soap:address location="http://somewhere&amp;webService=ManterFornecedor"/> 
     </wsdl:port> 
    </wsdl:service> 

</wsdl:definitions> 

我提供的完整的WSDL,但問題的重要組成部分,是

<soap:operation soapAction="urn:ManterFornecedor/Novo" style="document"/> 
    <wsdl:input> 
     <soap:header message="s0:ARAuthenticate" part="parameters" use="literal"></soap:header> 
     <soap:body use="literal"/> 
    </wsdl:input> 

正如你可以看到,輸入在它的頭,它是

<wsdl:message name="ARAuthenticate"> 
    <wsdl:part element="s0:AuthenticationInfo" name="parameters"></wsdl:part> 
</wsdl:message> 

<xsd:element name="AuthenticationInfo" type="s0:AuthenticationInfo"/> 
<xsd:complexType name="AuthenticationInfo"> 
<xsd:sequence> 
    <xsd:element name="userName" type="xsd:string"/> 
    <xsd:element name="password" type="xsd:string"/> 
    <xsd:element minOccurs="0" name="authentication" type="xsd:string"/> 
    <xsd:element minOccurs="0" name="locale" type="xsd:string"/> 
    <xsd:element minOccurs="0" name="timeZone" type="xsd:string"/> 
</xsd:sequence> 
</xsd:complexType> 
一個ARAuthenticate消息

我使用Eclipse的Web服務資源管理器來創建一個WS客戶端來測試這個Web服務,它工作!該客戶端具有要設置的用戶名和密碼字段。

好吧,現在我需要採取這個客戶端的例證代碼,並實現一個獨立的(而不是Web用戶界面)解決方案,收集信息並使用客戶端將其發送到服務器。但它失敗了,我相信這是因爲身份驗證。

只有我看到的用戶名和密碼被設置的地方是在PortSoapBindingStub.createCall():

org.apache.axis.client.Call _call = super._createCall(); 
    if (super.maintainSessionSet) { 
     _call.setMaintainSession(super.maintainSession); 
    } 
    if (super.cachedUsername != null) { 
     _call.setUsername(super.cachedUsername); 
    } 
    if (super.cachedPassword != null) { 
     _call.setPassword(super.cachedPassword); 
    } 
    if (super.cachedEndpoint != null) { 
     _call.setTargetEndpointAddress(super.cachedEndpoint); 
    } 
    if (super.cachedTimeout != null) { 
     _call.setTimeout(super.cachedTimeout); 
    } 
    if (super.cachedPortName != null) { 
     _call.setPortName(super.cachedPortName); 
    } 

但是,哪裏這些緩存的東西是從哪裏來的?我試圖修改這些代碼和手動設置,但一直收到錯誤:

Exception in thread "main" AxisFault 
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException 
faultSubcode: 
faultString: java.lang.ArrayIndexOutOfBoundsException: -1 
faultActor: 
faultNode: 
faultDetail: 
    {http://xml.apache.org/axis/}hostname:myhost 

java.lang.ArrayIndexOutOfBoundsException: -1 
    at org.apache.axis.message.SOAPFaultBuilder.createFault(SOAPFaultBuilder.java:222) 
    at org.apache.axis.message.SOAPFaultBuilder.endElement(SOAPFaultBuilder.java:129) 
    at org.apache.axis.encoding.DeserializationContext.endElement(DeserializationContext.java:1087) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) 
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source) 
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source) 
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(Unknown Source) 
    at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227) 
    at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696) 
    at org.apache.axis.Message.getSOAPEnvelope(Message.java:435) 
    at org.apache.axis.transport.http.HTTPSender.readFromSocket(HTTPSender.java:796) 
    at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:144) 
    at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32) 
    at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118) 
    at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83) 
    at org.apache.axis.client.AxisClient.invoke(AxisClient.java:165) 
    at org.apache.axis.client.Call.invokeEngine(Call.java:2784) 
    at org.apache.axis.client.Call.invoke(Call.java:2767) 
    at org.apache.axis.client.Call.invoke(Call.java:2443) 
    at org.apache.axis.client.Call.invoke(Call.java:2366) 
    at org.apache.axis.client.Call.invoke(Call.java:1812) 
    at ManterFornecedor.PortSoapBindingStub.novo(PortSoapBindingStub.java:174) 
    at ManterFornecedor.PortPortTypeProxy.novo(PortPortTypeProxy.java:50) 
    at caixa.pedes.br.ManterFornecedor.main(ManterFornecedor.java:43) 

這裏是我的代碼:

import java.net.MalformedURLException; 
import java.rmi.RemoteException; 
import javax.xml.rpc.ServiceException; 
import org.apache.axis.AxisFault; 
import org.apache.axis.client.Call; 

import ManterFornecedor.*; 

public class ManterFornecedor { 

    public static void main(String[] args) throws RemoteException, ServiceException, MalformedURLException { 

     InputMapping1 parameters = new InputMapping1(
       "fornecedor","contrato",java.util.Calendar.getInstance(), java.util.Calendar.getInstance(), 
       "produto",IC_STATUSType.Ativo 
       ); 


     java.net.URL endpoint = new java.net.URL("http://somewhere&amp;webService=ManterFornecedor"); 

     PortPortTypeProxy proxy = new PortPortTypeProxy(); 

     ManterFornecedorServiceLocator locator = new ManterFornecedorServiceLocator(); 
     ManterFornecedor.PortPortType port = locator.getPortSoap(); 

     PortSoapBindingStub client = new PortSoapBindingStub(endpoint,locator); 


     ManterFornecedor.OutputMapping1 response = proxy.novo(parameters); 

     System.out.println(response); 

    } 

} 

編輯:正如你所看到的,我是新來的Web服務和我'有點失落。我不知道爲什麼,但novo()方法在代理,定位器和存根中可用。我會更多地瞭解這些設計模式,因爲我對他們也是新手,並且使用所有3個設計模式更加麻煩。

什麼是最好的對象來調用WSDL生成的操作符?不幸的是,在Eclipse中創建的客戶端代碼使用JSP來接收參數,並且我無法將示例代碼正確隔離到實際客戶端,以便我可以開發我的代碼並調用客戶端的運算符。

如果客戶端被封裝在一個只需提供其配置(端點,身份驗證等)的獨特類中,然後調用運算符,就會容易得多。

回答

0

你必須之前把這個代碼setRequestHeaders(_call);PortTypeSoapBindingStub

try { 
     SOAPHeaderElement sopElement = new SOAPHeaderElement("urn:AuthenticationInfo","AuthenticationInfo") ; 
     sopElement.addChildElement("userName").addTextNode("XXXXX") ; 
     sopElement.addChildElement("password").addTextNode("XXXX"); 
     sopElement.addChildElement("authentication").addTextNode(""); 
     sopElement.addChildElement("locale").addTextNode(""); 
     sopElement.addChildElement("timeZone").addTextNode(""); 

     _call.addHeader(sopElement); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
相關問題