Search code examples
javawsdlweblogicjax-wswebservice-client

javax.xml.ws.WebServiceException: Failed to access the WSDL. Response: '401: Unauthorized'


I am trying to access a web service for a project i'm working on. I'm using JAX-WS and the app is deployed on weblogic. When i'm trying to access the WS, i get the following exception:

javax.portlet.PortletException: javax.xml.ws.WebServiceException: Failed to access the WSDL at: http://xxx.xxxx.ro:40000/idm/ws/cup?wsdl. It failed with: 
Response: '401: Unauthorized' for url: 'http://xxx.xxxx.ro:40000/idm/ws/cup?wsdl'.
at com.bea.portlet.container.PortletStub.processAction(PortletStub.java:346)
at com.bea.portlet.container.AppContainer.invokeProcessAction(AppContainer.java:678)
........

I read through a lot of posts regarding issue and i tried different types of auth. I tried to use BindingProvider, basicHTTPAuth in different usecases, disable HostnameVerifier etc. but still with no result.

Below is a snippet of my code, as the last tried version:

Authenticator.setDefault(new Authenticator() {
                    @Override
                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication(
                            username,
                            password.toCharArray());
                    }
                });


    ComputeUserProfileImplService computeUserProfileImplService = new ComputeUserProfileImplService(
    new URL(null, endpointURL, new sun.net.www.protocol.http.Handler()),
    new QName("http://xxx.xx.xxxxx.xxxxx.com/",
            "ComputeUserProfileImplService"));
    ComputeUserProfileImpl computeUserProfile = computeUserProfileImplService
    .getComputeUserProfileImplPort();

The ComputeUserProfileImplService code looks like :

private final static URL COMPUTEUSERPROFILEIMPLSERVICE_WSDL_LOCATION;
private final static Logger logger = Logger.getLogger(com.xxxxx.xxxxx.xx.xxxxx.cup.ComputeUserProfileImplService.class.getName());

static {
    URL url = null;
    try {
        URL baseUrl;
        baseUrl = com.xxxxx.xxxxx.xx.xxxxx.xxx.ComputeUserProfileImplService.class.getResource("");
        url = new URL(baseUrl, "http://xxxx.xxxxx.ro:40000/idm/ws/cup?wsdl");

    } catch (MalformedURLException e) {
        logger.warning("Failed to create URL for the wsdl Location: 'xxxxxxxxxxxxxxxx', retrying as a local file");
        logger.warning(e.getMessage());
    }
    COMPUTEUSERPROFILEIMPLSERVICE_WSDL_LOCATION = url;
}

Sorry for replacing the links, but i'm not authorised to post them since it's a pretty known organisation.. If you can help me with some suggestions, i will be grateful. I keep searching for solutions but i'm stuck.. i can't figure it out. It should be a workaround for this weblogic issue that applies to me... but i just can't find it. If you need it, i'll post some other snippets. Hope i was pretty clear with this.

Thanks in advance !!


Solution

  • Unfortunately Weblogic has a different approach, it uses its own URLStreamHandler that for some reason ignores authentication.

    Try to use Sun's implementation:

    instead of

     url = new URL(address); // use WebLogic handler
    

    use

     url = new URL(null, address, new sun.net.www.protocol.http.Handler()); // use Sun's handler