在上一篇的调用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. django的rest_framework框架源码剖析

    在看源码之前先了解一下什么是rest,restful api. 什么是rest 可以总结为一句话:REST是所有Web应用都应该遵守的架构设计指导原则. REST是Representational S ...

  2. sparse_softmax_cross_entropy_with_logits

    sparse_softmax_cross_entropy_with_logits 原创文章,请勿转载!!! 定义 sparse_softmax_cross_entropy_with_logits(_s ...

  3. Spring学习之装配Bean

    通过注解配置的bean,默认是单例 @Autowired private CodeTypeService codeTypeService; 测试:在Controller层调用Service层对象Cod ...

  4. javascipt中的DOM对象

    1.HTML中DOM对象的概念 HTML Document Object Model(文档对象模型) HTML DOM定义了访问和操作HTML文档的标准方法 HTML DOM把HTML文档呈现为带有元 ...

  5. wpf datagrid row height 行高自动计算使每行行高自适应文本

    wpf 的datagrid的行高 要么是Auto,要么是定值:但会带来麻烦就是每行行高都一样. 当需要按内容(主要是wrap 换行的textbox或textblock)来动态调整行高的时候,需要用到d ...

  6. 01 Java 搭建环境

    刚接触 Java 语言,为了方便以后查阅,将学习过程中遇到的知识点记录下来,作为学习笔记使用.在学习过程中 JDK 使用版本为 1.8.0_73,操作系统为 macOS Sierra 10.12.6. ...

  7. 使Eclipse下支持编写HTML/JS/CSS/JSP页面的自动提示

    1.打开eclipse→Windows→Preferences→Java→Editor→Content Assist 修改Auto Activation triggers for java的值为:zj ...

  8. ------ 解析因内核栈溢出导致的 “double fault” 蓝屏 ------

    -------------------------------------------------------------------------- 前一篇指出 tail_recursivef_fac ...

  9. maven的下载安装,配置本地仓库

    maven的下载安装 下载地址:http://maven.apache.org/download.cgi 下载完成后解压到某一个目录 配置环境变量 第一个环境变量 MAVEN_HOME A:\mave ...

  10. Mysql字符串截取总结:left()、right()、substring()、substring_index()

    同步首发:http://www.yuanrengu.com/index.php/20171226.html 在实际的项目开发中有时会有对数据库某字段截取部分的需求,这种场景有时直接通过数据库操作来实现 ...