Reputation: 115
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 !!
Upvotes: 2
Views: 40351
Reputation: 1
The following are suggestions that could solve your issue:
1) Change in the WEBLOGIC script setDomainEnv.sh to force WEBLOGIC to use SunHttpHandler
.
or
2) Call the webservice from the command prompt using a shell script/batch file.
or
3) Try this url object in your webservice new URL(null, "http://...", new sun.net.www.protocol.http.Handler());
or
4) Write your own sun http handler.
or
5) Try updating your weblogic-webservice.xml by adding your newly created webservice in it.
or
6) Try using jax-rpc instead of jax-ws.
Hopefully any of the first two will resolve your issue, however the other options are also helpful.
Upvotes: 0
Reputation: 41
I had the same issue in Weblogic. I can confirm for you that the solution suggested by Paulius Matulionis worked for me in Weblogic 11:
import my.MyPortType;
import javax.xml.namespace.QName;
import javax.xml.ws.BindingProvider;
import javax.xml.ws.Service;
import javax.xml.ws.handler.MessageContext;
import java.net.Authenticator;
import java.net.MalformedURLException;
import java.net.PasswordAuthentication;
import java.net.URL;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MyWebServiceClient {
public static void main(String[] args) {
URL url = null;
try {
url = new URL("http://host:10001/mycontext/ws?WSDL");
} catch (MalformedURLException e) {
e.printStackTrace();
}
try {
final String username = "some";
final String password = "other";
Authenticator.setDefault(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(
username,
password.toCharArray());
}
});
QName qname = new QName("http://whatevertheqname/", "whatevertheservicename");
Service service = Service.create(url, qname);
MyPortType proxy = service.getPort(MyPortType.class);
Map<String, Object> requestContext = ((BindingProvider) proxy).getRequestContext();
requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, url.toString());
requestContext.put(BindingProvider.USERNAME_PROPERTY, username);
requestContext.put(BindingProvider.PASSWORD_PROPERTY, password);
Map<String, List<String>> headers = new HashMap<String, List<String>>();
headers.put("Timeout", Collections.singletonList("10000"));
requestContext.put(MessageContext.HTTP_REQUEST_HEADERS, headers);
String result = proxy.myMethod23");
System.out.println("Result is: " + result);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("Error occurred in operations web service client initialization", e);
}
}
}
Upvotes: 4
Reputation: 101
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
Upvotes: 5
Reputation: 23415
I did no try this in WebLogic, but on Tomcat, Glassfish, Apache Karaf, the cliet call to web service which needs the basic authentication this works just great:
/**
* Proxy.
*/
private OperationsService proxy;
/**
* Operations wrapper constructor.
*
* @throws SystemException if error occurs
*/
public OperationsWrapper()
throws SystemException {
try {
final String username = getBundle().getString("wswrappers.operations.username");
final String password = getBundle().getString("wswrappers.operations.password");
Authenticator.setDefault(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(
username,
password.toCharArray());
}
});
URL url = new URL(getBundle().getString("wswrappers.operations.url"));
QName qname = new QName("http://hltech.lt/ws/operations", "Operations");
Service service = Service.create(url, qname);
proxy = service.getPort(OperationsService.class);
Map<String, Object> requestContext = ((BindingProvider) proxy).getRequestContext();
requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, url.toString());
requestContext.put(BindingProvider.USERNAME_PROPERTY, username);
requestContext.put(BindingProvider.PASSWORD_PROPERTY, password);
Map<String, List<String>> headers = new HashMap<String, List<String>>();
headers.put("Timeout", Collections.singletonList(getBundle().getString("wswrappers.operations.timeout")));
requestContext.put(MessageContext.HTTP_REQUEST_HEADERS, headers);
} catch (Exception e) {
LOGGER.error("Error occurred in operations web service client initialization", e);
throw new SystemException("Error occurred in operations web service client initialization", e);
}
}
I do not think that WebLogic has something different. This should work.
Upvotes: 2