(四)输入参数与输出类型为复杂类型的web服务
一、 服务端发布服务
1.1 定义复杂类型:UserBean.java
package service; public class UserBean { private String userId; private String userName; private String passWord; //隐藏getset方法 }
1.2 定义服务接口 :UserService.java
package service; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; /** * 这是一个web服务 * @author Administrator * */ @WebService public interface UserService { /** * 获取用户 * @return */ @WebResult(name = "getUserResult") public UserBean getUser(); /** * 设置用户 * @param user */ public void setUser(@WebParam(name = "userBean") UserBean user); }
1.3 定义服务实现类
package service; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; @WebService(endpointInterface="service.UserService") public class UserServiceimpl implements UserService { @Override public UserBean getUser() { UserBean user = new UserBean(); user.setPassWord("123"); user.setUserId("001"); user.setUserName("服务端返回的用户"); return user; } @Override public void setUser(UserBean user) { if (user != null) { System.out.println("客户端设置的用户=" + user); } } }
1.4 发布服务
package publish; import javax.xml.ws.Endpoint; import service.UserServiceimpl; public class TestPublish { public static void main(String[] args) { Endpoint.publish("http://localhost:3030/userBean", new UserServiceimpl()); System.out.println("发布成功....."); } }
二、客户端接受、发送消息到服务端
2.1 用工具生成客户端代码(具体步骤参照上一章)
2.2 发送、接收消息
package test; import java.rmi.RemoteException; import service.UserBean; import service.UserService; import service.UserServiceProxy; public class TestMain { public static void main(String[] args) throws RemoteException { /** * 获取服务端返回的用户 */ UserService userService=new UserServiceProxy().getUserService(); UserBean user=userService.getUser(); System.out.println(user.getUserId()+"\t"+user.getUserName()); /** * 客户端设置用户 */ UserBean userbean=new UserBean(); userbean.setUserId("2"); userbean.setUserName("客户端设置的用户"); userbean.setPassWord("123520"); new UserServiceProxy().setUser(userbean); } }
结果:
- 注意:于普通的 Java 数据类型、JavaBean、List 而言,SOAP 服务可以完全将其处理(序列化与反序列化),这些都没有任何问题,但对于 Map 对象而言,不能再放其他复杂类型。
- 一般来说,参数只传字符串类型,因为web服务可以不同语言调用的,而java复杂类型其他语言可能没有,但是所有语言共有字符串类型。而传递的字符串可以将数据封装成json/xml格式的字符串,然后客户端接收到json/xml格式的字符串再进行解析即可。