在上一篇的调用xfire发布的webService服务中,我只是从服务端返回了一个字符串给客户端,却没有测试从客户端传递数据给服务端。而实际应用中一般是不太可能只出现这样的应用场景的,因此我便更进一步测试了客户端传递数据给服务端。

因为相关的jar包在上一篇已经说过,因此便不再重复说明,这次的测试步骤如下:

一、测试向服务端传递字符串(重点在第二个):

    为了进一步理解服务搭建,我重新写了一个服务端服务类:

接口:
package xfireTest;

public interface XFireTestService {
    public String test(String cont);
}

实现类:
package xfireTest.xfireTestImp;
import xfireTest.XFireTestService;

public class XFireTestImp implements XFireTestService {

    @Override
    public String test(String cont) {
        cont = "webService收到消息:" + cont;
        return cont;
    }
}

在之前的services.xml中加入了以下代码:
<service xmlns="http://xfire.codehaus.org/config/1.0">
        <!-- webService服务的名称 -->
        <name>XFireTest</name>
        <namespace>http://xfireTest/XFireTestService</namespace>
        <!-- 自己所写的接口路径 -->
        <serviceClass>
            xfireTest.XFireTestService
        </serviceClass>
        <!-- 实现类路径 -->
        <implementationClass>
            xfireTest.xfireTestImp.XFireTestImp
        </implementationClass>
    </service>

然后是另外一个项目中模拟客户端调用代码,同样是需要先创建和服务端一样的服务接口:
package test;

public interface XFireTestService {
    public String test(String cont);
}

然后是调用:
package test;

import org.codehaus.xfire.XFireFactory;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;

public class CallWebServiceTest1 {
    public static void main(String[] args) {
        Service srModel = new ObjectServiceFactory()
                .create(XFireTestService.class);
        XFireProxyFactory factory = new XFireProxyFactory(XFireFactory
                .newInstance().getXFire());// 创建工厂实例

        String helloURL = "http://localhost:8082/xfireTest/services/XFireTest";
        try {
            XFireTestService service = (XFireTestService) factory.create(
                    srModel, helloURL);
            System.out.println(service.test("测试"));
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

这里的调用是比较简单的,也没有什么问题,字符串的传递完全可以。


二、调用时传递对象(重点在结尾处)

这个测试,我写了一个简单的UserModel类,用来当做参数使用,根据网上的一些资料,我给实体类做了序列化,如下:
package xfireTest;
import java.io.Serializable;
public class UserModel implements Serializable {

    /**
     *
     */
    private static final long serialVersionUID = -8344776127885486411L;

    public UserModel() {
        super();
    }

    public UserModel(String userName, int age) {
        super();
        this.userName = userName;
        this.age = age;
    }

    /**
     * 用户名
     */
    private String userName;
    /**
     * 用户年龄
     */
    private int age;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "UserModel [userName=" + userName + ", age=" + age + "]";
    }
}

然后是对应的接口:
package xfireTest;
import javax.jws.WebParam;
import javax.jws.WebService;

@WebService(serviceName = "UserService", targetNamespace = "http://xfireTest/UserService")
public interface UserService {
    public UserModel addUser(@WebParam(name = "user") UserModel user);
}

实现类:
package xfireTest.xfireTestImp;
import xfireTest.UserModel;
import xfireTest.UserService;
public class UserServiceImp implements UserService {

    @Override
    public UserModel addUser(UserModel user) {
        // System.out.println(user);
        System.out.println(user.getUserName() + ":" + user.getAge());
        return user;
    }
}

services.xml中加入如下代码:
 <service xmlns="http://xfire.codehaus.org/config/1.0">
        <!-- webService服务的名称 -->
        <name>UserService</name>
        <namespace>http://xfireTest/UserService</namespace>
        <!-- 自己所写的接口路径 -->
        <serviceClass>
            xfireTest.UserService
        </serviceClass>
        <!-- 实现类路径 -->
        <implementationClass>
            xfireTest.xfireTestImp.UserServiceImp
        </implementationClass>
    </service>

然后是客户端调用的代码:
package test;
import org.codehaus.xfire.XFireFactory;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;

public class CallWebServiceTest2 {

    public static void main(String[] args) {
        Service srModel = new ObjectServiceFactory().create(UserService.class);
        XFireProxyFactory factory = new XFireProxyFactory(XFireFactory
                .newInstance().getXFire());// 创建工厂实例

        String helloURL = "http://localhost:8082/xfireTest/services/UserService";
        try {
            UserService service = (UserService) factory.create(srModel,
                    helloURL);
            UserModel user = new UserModel();
            user.setAge(22);
            user.setUserName("test");
            System.out.println(service.addUser(user));
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

    }
}

因为和服务端是不同的项目,因此需要自己新建和服务端一样的服务接口以及UserModel类,我都写在和上一个类的同一个包中,即test中:

接口:
package test;
import javax.jws.WebParam;
import javax.jws.WebService;

@WebService(serviceName = "UserService", targetNamespace = "http://xfireTest/UserService")
public interface UserService {
    public UserModel addUser(@WebParam(name = "user") UserModel user);
}

UserModel类:
package test;
import java.io.Serializable;
public class UserModel implements Serializable {

    /**
     *
     */
    private static final long serialVersionUID = 9024481738536854407L;

    public UserModel() {
        super();
    }

    public UserModel(String userName, int age) {
        super();
        this.userName = userName;
        this.age = age;
    }

    /**
     * 用户名
     */
    private String userName;
    /**
     * 用户年龄
     */
    private int age;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "UserModel [userName=" + userName + ", age=" + age + "]";
    }
}

上边这些代码和之前的比较,除开加了一些注解外,基本上没有多大区别,然后启动服务端,并在模拟的客户端中调用,结果控制台的打印信息却不是预想中的,都成了默认值,如图:


于是又查了许多资料,并在项目老大的帮助下找到了原因。竟然是因为我客户端的UserModel类的包名和服务端的不一样,于是新建了一个和服务端一样的包,并把这个UserModel挪过去,然后再启动模拟客户端的main方法,控制台如愿以偿的输出结果,至此整个测试完毕。








java程序调用xfire发布的webService服务(二)的更多相关文章

  1. java程序调用xfire发布的webService服务

    昨天用xfire搭好了一个简单的webService的服务,可以在浏览器访问,今天便想要尝试以下如何调用这个服务及相关的方法.在网上查找了一些资料后,实现过程如下. 1.创建一个maven web项目 ...

  2. Java调用IIS发布的WebService

    之前的一篇博客说了一个实例,就是用VS2005在IIS上发布WebService.今天我们来实现在Eclipse上用Java来调用昨天发布的WebService. 首先咋在浏览器中输入http://1 ...

  3. 如何调用别人发布的WebService程序

    这篇经验会告诉我们如何调用别人发布的WebService,并且需要注意的事项.现在就拿获取天气预报的接口举例,因为文中不允许有链接,所以在下文图中有WebService链接的地址. 工具/原料   V ...

  4. VS2013如何调用别人发布的WebService程序

    这篇经验会告诉我们如何调用别人发布的WebService,并且需要注意的事项.现在就拿获取天气预报的接口举例,因为文中不允许有链接,所以在下文图中有WebService链接的地址. 工具/原料 VS2 ...

  5. WebService学习总结——调用第三方提供的webService服务

    互联网上面有很多的免费webService服务,我们可以调用这些免费的WebService服务,将一些其他网站的内容信息集成到我们的Web应用中显示,下面就以获取天气预报数据. 气象中心的管理系统将收 ...

  6. WebService学习总结(四)——调用第三方提供的webService服务

    http://www.cnblogs.com/xdp-gacl/p/4260627.html 互联网上面有很多的免费webService服务,我们可以调用这些免费的WebService服务,将一些其他 ...

  7. WebService学习--(四)调用第三方提供的webService服务

    互联网上面有很多的免费webService服务,我们可以调用这些免费的WebService服务,将一些其他网站的内容信息集成到我们的Web应用中显示,下面就以获取天气预报数据和查询国内手机号码归属地为 ...

  8. 【WebService】调用第三方提供的webService服务(七)

    互联网上面有很多的免费webService服务,我们可以调用这些免费的WebService服务,将一些其他网站的内容信息集成到我们的Web应用中显示,下面就以获取天气预报数据和查询国内手机号码归属地为 ...

  9. 自定义及发布一个webservice服务

    自定义及发布一个webservice服务    - 声明 某个业务服务为webservice服务       通过@webservice 注解来声明    - 发布webservice服务       ...

随机推荐

  1. 隐藏C语言黑窗口

    隐藏C语言程序运行的黑窗口,加入预编译命令: (预编译,Linker链接,windows模式,黑窗口是dos模式) #pragma comment(linker,"/subsystem:\& ...

  2. SQL Server判断是否满足日期格式(YYYYMMDD)以及中文等判断,格式化为YYYY-MM-DD

    SQL Server判断是否满足日期格式(YYYYMMDD)以及中文等判断: 在做sql数据的正确性审核中,需要判断数据是否满足日期格式,网上找不到相关的资料,于是自己花了半天写了一个简单的函数 具体 ...

  3. 给HttpClient添加Socks代理

    本文描述http client使用socks代理过程中需要注意的几个方面:1,socks5支持用户密码授权:2,支持https:3,支持让代理服务器解析DNS: 使用代理创建Socket 从原理上来看 ...

  4. Vsftp的PASV mode(被动模式传送)和Port模式解释

    什么叫做PASV mode(被动模式传送)?他是如何工作的?FTP的连接一般是有两个连接的,一个是客户程和服务器传输命令的,另一个是数据传送的连接.FTP服务程序一般会支持两种不同的模式,一种是Por ...

  5. 关于C#连接Oracle数据库 尝试加载Oracle客户端时引发BadImageFormatException 如果在安装32位Oracle客户端组件的情况下以64位模式运行,将出现此问题

    这个问题已经困扰了我快一个月了,各种百度,各种博客,可是,一个个都试过了,什么下载32位客户端,配置环境变量什么的,纯属扯犊子,开发环境win10 64位    oracle 11g r2 64位,这 ...

  6. require和require_once的区别

    require 的使用方法如 require("./inc.php"); .通常放在 PHP 程式的最前面,PHP 程式在执行前,就会先读入 require 所指定引入的档案,使它 ...

  7. BZOJ 4216: Pig [分块]

    传送门 询问区间和...内存3M 分块前缀和... 我连swap都是这么l=l^r , r=l^r , l=l^r写的.... #include <cstdio> typedef long ...

  8. CA证书扫盲,https讲解。

    很多关于CA证书的讲解. 1.什么是CA证书. 看过一些博客,写的比较形象具体. ◇ 普通的介绍信 想必大伙儿都听说过介绍信的例子吧?假设 A 公司的张三先生要到 B 公司去拜访,但是 B 公司的所有 ...

  9. python爬虫(3)——SSL证书与Handler处理器

    一.SSL证书问题 上一篇文章,我们创建了一个小爬虫,下载了上海链家房产的几个网页.实际上我们在使用urllib联网的过程中,会遇到证书访问受限的问题. 处理HTTPS请求SSL证书验证,如果SSL证 ...

  10. qt的编译

    cp qt-everywhere-opensource-src-5.5.0.tar.gz /opt/qt/2.1 解压qt源码 sudo tar xzf qt-everywhere-opensourc ...