Reputation: 23
I've used default eclipse wizard to create a web service client (File>New>Other and select a wizard for web service client). The classes were generated and I was able to use service methods with code like this:
import java.rmi.RemoteException;
import javax.xml.rpc.ServiceException;
import com.olsn.ws.ShipmentService_PortType;
import com.olsn.ws.ShipmentService_ServiceLocator;
public class wsClient {
public static void main(String[] args) throws ServiceException, RemoteException {
//To load the web service and to create the client
ShipmentService_ServiceLocator WS = new ShipmentService_ServiceLocator();
ShipmentService_PortType client = WS.getShipmentServicePort();
//To get Close status for Issue
System.out.println(client.getCloseDesc("35557"));
//To get the list of NetP projects
for (int i=1; i<client.getProjects().length;i++)
{System.out.println(client.getProjects()[i].toString());}
}
}
The problem now is that the username and password were introduced, and I don't know how to modify my code to access the server, I was trying to add authenticator:
import java.net.Authenticator;
import java.net.PasswordAuthentication;
Authenticator myAuth = new Authenticator()
{
@Override
protected PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication("user", "password".toCharArray());
}
};
Authenticator.setDefault(myAuth);
or change _initShipmentServiceProxy() method of generated proxy class
private void _initShipmentServiceProxy() {
try {
shipmentService_PortType = (new com.olsn.ws.ShipmentService_ServiceLocator()).getShipmentServicePort();
if (shipmentService_PortType != null) {
if (_endpoint != null)
{
((javax.xml.rpc.Stub)shipmentService_PortType)._setProperty("javax.xml.rpc.service.endpoint.address", _endpoint);
**((javax.xml.rpc.Stub)shipmentService_PortType)._setProperty(javax.xml.rpc.Stub.USERNAME_PROPERTY, "user");
((javax.xml.rpc.Stub)shipmentService_PortType)._setProperty(javax.xml.rpc.Stub.PASSWORD_PROPERTY, "password");**
}
else
_endpoint = (String)((javax.xml.rpc.Stub)shipmentService_PortType)._getProperty("javax.xml.rpc.service.endpoint.address");
}
}
catch (javax.xml.rpc.ServiceException serviceException) {}
}
But I continue getting these errors:
org.apache.axis.utils.JavaUtils isAttachmentSupported
WARNING: Unable to find required classes (javax.activation.DataHandler and javax.mail.internet.MimeMultipart). Attachment support is disabled.
Exception in thread "main" AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Client.Authentication
faultSubcode:
faultString: Access denied to operation getCloseDesc
Please advise what should I change?
Upvotes: 0
Views: 11716
Reputation: 23415
From your error I assume you are using Axis
so the Authenticator
won't work on it. If you want to perform the client's basic authentication to Axis
service, you need to do something like this:
private static final Logger LOGGER = LoggerFactory.getLogger(YourClass.class);
private ShipmentService_PortType proxy;
public void init()
throws Exception {
ShipmentService_ServiceLocator locator = new ShipmentService_ServiceLocator();
try {
LOGGER.debug("Initializing shipment service...");
proxy = locator.getShipmentServicePort(new URL("yourServiceEndpointURL"));
((ShipmentServicePortBindingStub) proxy).setUsername("yourUsername");
((ShipmentServicePortBindingStub) proxy).setPassword("yourPassword");
((ShipmentServicePortBindingStub) proxy).setTimeout(10000);
LOGGER.debug("Shipment service successfully initialized.");
} catch (ServiceException e) {
LOGGER.error("Error in shipment client initialization", e);
throw new Exception("Error in shipment client initialization.");
} catch (MalformedURLException e) {
LOGGER.error("Error in shipment client initialization", e);
throw new Exception("Error in shipment client initialization.");
}
}
And only when this init()
method will be called you will be able to call your client's methods through this:
proxy.getCloseDesc("35557");
Upvotes: 2