I just solved a problem with a Java web service client I've been working on. I've been trying to read a Java web service that was created with Apache Axis2, and it has methods that can return an array or List
of User
objects. I couldn't find any examples on the Axis2 web site that showed how to get an array or List
from a web service client, but I finally find the solution by digging around a little.
In this post I'll provide some sample Java source code that shows what I did to solve this problem.
The Java web service client
First, here's the Java web service client that gets a list of User
objects from a web service:
package sample.pojo.rpcclient; import javax.xml.namespace.QName; import org.apache.axis2.AxisFault; import org.apache.axis2.addressing.EndpointReference; import org.apache.axis2.client.Options; import org.apache.axis2.rpc.client.RPCServiceClient; import java.lang.reflect.*; import java.util.*; import sample.pojo.data.User; import static java.lang.System.out; public class UserClient { public static void main(String[] foos) throws AxisFault { RPCServiceClient serviceClient = new RPCServiceClient(); Options options = serviceClient.getOptions(); EndpointReference targetEPR = new EndpointReference("http://localhost:8080/axis2/services/UserService"); options.setTo(targetEPR); // // here i call a web service method that returns one User // QName qname1 = new QName("http://service.pojo.sample", "getUser"); Object[] args1 = new Object[] { }; Class[] types1 = new Class[] { User.class }; Object[] response1 = serviceClient.invokeBlocking(qname1, args1, types1); User u1 = (User) response1[0]; if (u1 == null) { System.out.println("u1 was null"); return; } System.out.println(u1.getFirstName()); System.out.println(u1.getLastName()); System.out.println(u1.getUserId()); // // the biggie: // call a web service method that returns a List of User objects // QName qname2 = new QName("http://service.pojo.sample", "getUserList"); Object[] args2 = new Object[] { }; Class[] types2 = new Class[] { User[].class }; Object[] response2 = serviceClient.invokeBlocking(qname2,args2,types2); User[] users = (User[]) response2[0]; for (int i=0; i<users.length; i++) { User u2 = users[i]; if (u2 == null) { System.out.println("u2 was null"); System.exit(1); } System.out.println(i + ": " + u2.getFirstName() + "," + u2.getLastName() + ", " + u2.getUserId()); } } }
As you might guess from looking at that sample code, the most important section of code is this block:
QName qname2 = new QName("http://service.pojo.sample", "getUserList"); Object[] args2 = new Object[] { }; Class[] types2 = new Class[] { User[].class }; Object[] response2 = serviceClient.invokeBlocking(qname2,args2,types2); User[] users = (User[]) response2[0];
A lot of the magic to the solution is buried in those simple User[]
references, where I'm saying that I expect to get an array of User
objects back from my web service call.
The Java web service
Here's the code for my Java web service, including a getUserList
method that returns a List of User
objects:
package sample.pojo.service; import java.util.ArrayList; import java.util.List; import sample.pojo.data.User; // note: can call the service methods like this from a browser // http://localhost:8080/axis2/services/UserService/setTwoNumbers?param0=5¶m1=10 // http://localhost:8080/axis2/services/UserService/getNum1 // http://localhost:8080/axis2/services/UserService/getNum2 public class UserService { User user; int num1, num2; public void setTwoNumbers(int num1, int num2) { this.num1 = num1; this.num2 = num2; } public int getNum1() { return num1; } public int getNum2() { return num2; } public void setUser(User user) { this.user = user; } public User getUser() { User u = new User(); u.setFirstName("Barney"); u.setLastName("Rubble"); u.setUserId(99); return u; } public List<User> getUserList() { List<User> users = new ArrayList<User>(); User al = new User(); al.setFirstName("Al"); al.setLastName("Alexander"); al.setUserId(100); users.add(al); User fred = new User(); fred.setFirstName("Fred"); fred.setLastName("Flinstone"); fred.setUserId(101); users.add(fred); return users; } public User[] getUserArray() { User[] arr = new User[2]; User al = new User(); al.setFirstName("Al"); al.setLastName("Alexander"); al.setUserId(100); arr[0] = al; User fred = new User(); fred.setFirstName("Fred"); fred.setLastName("Flinstone"); fred.setUserId(101); arr[1] = fred; return arr; } }
The User class
And here's the Java source code for my User
class:
package sample.pojo.data; public class User { private String firstName; private String lastName; private int userId; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public int getUserId() { return userId; } public void setUserId(int userId) { this.userId = userId; } }