soap ui generated code
Question: I have a webservice I am trying to build a client for.

I have the following wsdl:

    
    
    http://www.cmicdataservices.com/datacenter/service.asmx?wsdl
    

It requires authentication. Looking at the WSDL description I see no method
that takes an authentication object, nor username and passwords as arguments.
Using Netbeans I have generated jax-ws sources for the WSDL. I however can not
figure out what to do after that.

Using soapui I can connect to the webservice and run all the methods. But once
again, I want to build this into a client that can be run without my
interaction.

My problem comes in figuring out how to use this generated code, which it
appears netbeans.tv had a video(netbeans soapui plugin video 2) which has
since been lost. Does anyone know of any tutorials or know of any examples of
how I can use this generated code to access the webservice?

so I have a method CheckifAuthorized()

Running in soapui I get the following xml

    
    
    <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:cmic="http://www.cmicdataservices.com/">
       <soap:Header>
          <cmic:Authentication>
             <!--Optional:-->
             <cmic:UserName>username</cmic:UserName>
             <!--Optional:-->
             <cmic:Password>password</cmic:Password>
          </cmic:Authentication>
       </soap:Header>
       <soap:Body>
          <cmic:CheckIfAuthorized/>
       </soap:Body>
    </soap:Envelope>
    

I can then run that request in soap ui and get back the response that
authentication was a success.

With the jax-ws code generated with netbeans and with soapui as well I have
the following:

    
    
    package javaapplication7;
    
    /**
     *
     * @author grant
     */
    public class Main {
    
        public static void main(String[] args) {
    
            Boolean result = checkIfAuthorized();
            System.out.println("The result is: " + result);
        }
    
        private static boolean checkIfAuthorized() {
            javaapplication7.CMICDatacenterService service = new javaapplication7.CMICDatacenterService();
            javaapplication7.CMICDatacenterServiceSoap port = service.getCMICDatacenterServiceSoap();
            return port.checkIfAuthorized();
        }
    }
    

This will fail with the following error

    
    
    run:
    Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: Server was unable to process request. ---> Object reference not set to an instance of an object.
            at com.sun.xml.internal.ws.fault.SOAP11Fault.getProtocolException(SOAP11Fault.java:178)
            at com.sun.xml.internal.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:111)
            at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:108)
            at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:78)
            at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:107)
            at $Proxy30.checkIfAuthorized(Unknown Source)
            at javaapplication7.Main.checkIfAuthorized(Main.java:24)
            at javaapplication7.Main.main(Main.java:17)
    Java Result: 1
    

This is the same problem I ran into when trying to use python for the service.
I have since chosen to go with Java as I feel I may have quicker turnaround on
parsing the xml and creating objects as I already have the entities for this
created.

Thank you.

Grant

I did not want to answer this because I would still like to figure out what I
can do here, but I did just end up writing the request by hand with the
following. Now I can just convert this into an xml object and go about my way,
but I imagine soapui makes all of this much easier. What I really do not
understand is how to use soapui to build this request and incorporate it into
my project:

    
    
    public class Main {
    
        public final static String DEFAULT_SERVER =
                "http://www.cmicdataservices.com/datacenter/service.asmx";
        public final static String SOAP_ACTION =
                "http://www.cmicdataservices.com/CheckIfAuthorized";
    
         public static void main(String[] args) {
             String server = DEFAULT_SERVER;
             String UserName = "Username";
             String Password="Password";
    
    
         try{
                 URL url = new URL(server);
                 HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    
                connection.setDoOutput(true);
                connection.setDoInput(true);
                connection.setRequestMethod("POST");
                connection.setRequestProperty("Content-Type", "application/soap+xml; charset=utf-8");
                connection.setRequestProperty("Host", "www.cmicdataservices.com");
                OutputStream out = connection.getOutputStream();
                Writer wout = new OutputStreamWriter(out);
                // Uncomment the following and comment out the previous two lines to see your xml
                //BufferedWriter wout = new BufferedWriter(new FileWriter("/tmp/testXML.xml"));
    
                //Start writing soap request - Envelope
                wout.write("<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n");
                wout.write("<soap12:Envelope ");
                wout.write("xmlns:xsi=");
                wout.write("'http://www.w3.org/2001/XMLSchema-instance' ");
                wout.write("xmlns:xsd=");
                wout.write("'http://www.w3.org/2001/XMLSchema' ");
                wout.write("xmlns:soap12=");
                wout.write("'http://www.w3.org/2003/05/soap-envelope'>\r\n");
    
                //Soap request header start
                wout.write("<soap12:Header>\r\n");
    
                //Start writing soap request - Authentication
                wout.write("<Authentication xmlns=");
                wout.write("'http://www.cmicdataservices.com/'>\r\n");
                wout.write("<UserName>" + UserName + "</UserName>\r\n");
                wout.write("<Password>" + Password + "</Password>\r\n");
                // End Authentication
                wout.write("</Authentication>\r\n");
    
                //End the header
                wout.write("</soap12:Header>\r\n");
    
                //Start writing the body
                wout.write("<soap12:Body>");
                wout.write("<GetCurrentDataVer1 xmlns=");
                wout.write("'http://www.cmicdataservices.com/' />\r\n");
                // End the Body
                wout.write("</soap12:Body>\r\n");
    
                // End the Envelope
                wout.write("</soap12:Envelope>\r\n");
    
                wout.flush();
                wout.close();
    
    
                //BufferedWriter fout = new BufferedWriter(new FileWriter("/tmp/testXMLResponse.xml"));
                InputStream in = connection.getInputStream();
                createFile(in, "/tmp/testXMLResponse.xml");
         }
         catch (IOException e) {
             System.err.println(e);
         }
         }
    
         public static void createFile(InputStream io, String fileName) throws IOException {
             FileOutputStream fout = new FileOutputStream(fileName);
             byte[] buf = new byte[256];
             int read = 0;
             while ((read = io.read(buf)) != -1){
                 fout.write(buf, 0, read);
             }
         }
    


Answer: The problem with your code is lack of Authentication element in the SOAP
header. Take a look at the WSDL, it should always be there:

    
    
    <wsdl:operation name="CheckIfAuthorized">
        <soap:operation soapAction="http://www.cmicdataservices.com/CheckIfAuthorized" style="document"/>
        <wsdl:input>
            <soap:body use="literal"/>
            <soap:header message="tns:CheckIfAuthorizedAuthentication" part="Authentication" use="literal"/>
        </wsdl:input>
        <wsdl:output>
            <soap:body use="literal"/>
        </wsdl:output>
    </wsdl:operation>
    

You server fails with exception because of incorrect XML when there is no
Authentication element in the CheckIfAuthorized request. Here is sample client
in Python to demonstrate the idea of solving the problem, I think it's not a
problem for you to convert it to Java.

    
    
    from suds.client import Client
    
    client = Client("http://www.cmicdataservices.com/datacenter/service.asmx?wsdl")
    auth = client.factory.create('Authentication')
    auth.UserName = "username"
    auth.Password = "password"
    client.set_options(soapheaders=auth)
    client.service.CheckIfAuthorized()
    

