1

I've generated some Java code from a wsdl file and the request itself seems to be working, but I can't send my credentials.

I've tested the Webservice with a tool called "SoapUI" and everything seemes to be working like a charm.

Here is an example of the (working) xml:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:beac="url">
  <soapenv:Header>
    <nsAuthn:authnHeader xmlns:nsAuthn="url/auth">
      <nsAuthn:id>id</nsAuthn:id>
      <nsAuthn:password>password</nsAuthn:password>
    </nsAuthn:authnHeader>
  </soapenv:Header>
  <soapenv:Body>
    <beac:getData>
      <saisonid>int</saisonid>
    </beac:getData>
  </soapenv:Body>
</soapenv:Envelope>

And this is my attempt:

public RankDtoResponse getData(int saisonid) throws java.rmi.RemoteException, SOAPException {
    if (super.cachedEndpoint == null) {
        throw new org.apache.axis.NoEndPointException();
    }

    SOAPHeaderElement authentication = new SOAPHeaderElement("url","auth");
    SOAPHeaderElement user = new SOAPHeaderElement("url","id", "id");
    SOAPHeaderElement password = new SOAPHeaderElement("url","password", "password");
    try {
        authentication.addChild(user);
        authentication.addChild(password);
    } catch (SOAPException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    org.apache.axis.client.Call _call = createCall();
    _call.setOperation(_operations[3]);
    _call.setUseSOAPAction(true);
    _call.setSOAPActionURI("");
    _call.setEncodingStyle(null);
    _call.setProperty(org.apache.axis.client.Call.SEND_TYPE_ATTR, Boolean.FALSE);
    _call.setProperty(org.apache.axis.AxisEngine.PROP_DOMULTIREFS, Boolean.FALSE);
    _call.setSOAPVersion(org.apache.axis.soap.SOAPConstants.SOAP11_CONSTANTS); 
    _call.setOperationName(new javax.xml.namespace.QName("url", "getData"));


    setHeader(authentication);
    setRequestHeaders(_call);
    setAttachments(_call);
    try {        java.lang.Object _resp = _call.invoke(new java.lang.Object[] {new java.lang.Integer(saisonid)});

    if (_resp instanceof java.rmi.RemoteException) {
        throw (java.rmi.RemoteException)_resp;
    }
    else {
        extractAttachments(_call);
        try {
            return (RankDtoResponse) _resp;
        } catch (java.lang.Exception _exception) {
            return (RankDtoResponse) org.apache.axis.utils.JavaUtils.convert(_resp, RankDtoResponse.class);
        }
    }
    } catch (org.apache.axis.AxisFault axisFaultException) {
      if (axisFaultException.detail != null) {
        if (axisFaultException.detail instanceof java.rmi.RemoteException) {
          throw (java.rmi.RemoteException) axisFaultException.detail;
        }
        if (axisFaultException.detail instanceof SOAPException) {
          throw (SOAPException) axisFaultException.detail;
        }
    }
    throw axisFaultException;
  }  
}

Error:

AxisFault
faultCode: 1-1-3
faultSubcode: 
faultString: Could not authenticate, credentials not specified
faultActor: 
faultNode: 
faultDetail: 
  {http://xml.apache.org/axis/}stackTrace:Could not authenticate, credentials not specified
  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.handlers.soap.MustUnderstandChecker.invoke(MustUnderstandChecker.java:62)
  at org.apache.axis.client.AxisClient.invoke(AxisClient.java:206)
  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 getData.getData(getData.java:496)
  at Client.main(Client.java:20) 

Most of the code is autogenerated from a wsdl file by wsdl2java.

Do you need any more information? Am I missing something out?

Thanks in advance

CasualCode
  • 45
  • 1
  • 3
  • 10
  • _"but I can't send my credentials"_ - sorry, that's is not enough detail. Please explain clearly what that means, and include any error messages and COMPLETE stack trace if applicable. – Jim Garrison Jul 24 '18 at 23:43
  • Ofc, sorry! I've edited the question, thanks for the feedback! To be a bit clearer: It seems like the application is not sending the credentials. Maybe I am declaring them in the wrong place. – CasualCode Jul 24 '18 at 23:58

2 Answers2

0

Your code looks good to me, so not sure where is actual problem. But rather then modifying stub class, I have done it while invoking the service method. Your code should look something like below and you could remove your code modifications to generated stub class, and it should work.

OMNamespace hdrNs =  
        OMAbstractFactory.getOMFactory().createOMNamespace("url/auth", "nsAuthn");  
SOAPHeaderBlock header = OMAbstractFactory.getSOAP12Factory().createSOAPHeaderBlock("authnHeader", hdrNs);  
header.addChild(AXIOMUtil.stringToOM("<id>$id</id>"));
header.addChild(AXIOMUtil.stringToOM("<password>$id</password>"));  
stub._getServiceClient().addHeader(header);  

Hope it will help!

Red Boy
  • 5,429
  • 3
  • 28
  • 41
0

I've used this approach and since you already have an example for adding data to the body, creating and adding something to the header was just as simple. Just had to get the Header with envelope.getHeader() and add my header data to it.

Thanks for the help!

CasualCode
  • 45
  • 1
  • 3
  • 10