'Java client using SAAJ error: SEVERE: SAAJ0008: Bad Response; Unauthorized

I have written a Java client code using SAAJ for Primevera P6 webservices. I am getting the below authentication error. I am providing the http username + password to the code but it gives error: SEVERE: SAAJ0008: Bad Response; Unauthorized. Could some one please help me with this issue. I am stuck in this problem since a long time. The wsdl of the web service is: https://sunpower-p6.oracleindustry.com/p6ws-token/services/ProjectService?wsdl.

ERROR: Request SOAP Message = 11106 Jul 18, 2016 1:03:19 PM com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection post SEVERE: SAAJ0008: Bad Response; Unauthorized com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Bad response: (401Unauthorized

My code:

public class TestClient {

    /*
     Method used to create the SOAP Request
    */
    private static SOAPMessage createSOAPRequest() throws Exception {

        // Next, create the actual message
        MessageFactory messageFactory = MessageFactory.newInstance();
        SOAPMessage    soapMessage    = messageFactory.createMessage();
        SOAPPart       soapPart       = soapMessage.getSOAPPart();


        String serverURI = "http://xmlns.oracle.com/Primavera/P6/WS/Project/V2";

        // SOAP Envelope
        SOAPEnvelope envelope = soapPart.getEnvelope();
        envelope.addNamespaceDeclaration("ProjectService", serverURI);

        //start: setting HTTP headers - optional, comment out if not needed
        String      authorization = Base64Coder.encodeString("xyz:abc");
        MimeHeaders hd            = soapMessage.getMimeHeaders();
        hd.addHeader("Authorization", "Basic " + authorization);
        //end: setting HTTP headers

        // Create and populate the body
        SOAPBody soapBody = envelope.getBody();

        // Create the main element and namespace
        SOAPElement soapBodyElem  = soapBody.addChildElement("ReadProjects", "ProjectService");
        SOAPElement soapBodyElem1 = soapBodyElem.addChildElement("Field", "ProjectService");
        SOAPElement soapBodyElem2 = soapBodyElem1.addChildElement("Id", "ProjectService");
        soapBodyElem2.addTextNode("11106");

        hd.addHeader("SOAPAction", serverURI + "ReadProjects");

        // Save the message
        soapMessage.saveChanges();

        // Check the input
        System.out.println("Request SOAP Message = ");
        soapMessage.writeTo(System.out);
        System.out.println();
        return soapMessage;
    }

    /**
     * Method used to print the SOAP Response
     */
    private static void printSOAPResponse(SOAPMessage soapResponse) throws Exception {
        // Create the transformer
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer        transformer        = transformerFactory.newTransformer();

        // Extract the content of the reply
        Source sourceContent = soapResponse.getSOAPPart().getContent();

        // Set the output for the transformation
        System.out.println("\nResponse SOAP Message = ");
        StreamResult result = new StreamResult(System.out);
        transformer.transform(sourceContent, result);
        System.out.println();
    }

    public static void main(String[] args) throws Exception {

        try {
            // First create the connection
            SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
            SOAPConnection        soapConnection        = soapConnectionFactory.createConnection();
            //System.out.println(soapConnection);

            //Send SOAP Message to SOAP Server
            String url = "https://sunpower-p6.oracleindustry.com/p6ws-token/services/ProjectService?wsdl";
            // Send the message and get the reply
            SOAPMessage soapResponse = soapConnection.call(createSOAPRequest(), url);

            // Process the SOAP Response
            printSOAPResponse(soapResponse);

            soapConnection.close();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }

    }
}


Solution 1:[1]

I realize this is an old question but would like to leave some assistance to anyone in the future who ends up here (like I did). There is a few likely situations that I have recently experienced regarding this.

  1. Check that your details are correct, or that the connection is possible. Be 100% sure before moving on.
  2. You will receive an unauthorized error if your database is not correctly configured for some setups (for instance, on JBoss). In my situation the data-source file was not being read properly when it attempted to connect causing the Unauthorized error on the client side.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1