(四)输入参数与输出类型为复杂类型的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()+"	"+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格式的字符串再进行解析即可。
原文地址:https://www.cnblogs.com/shyroke/p/7655255.html