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

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

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

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

接口:
  1. package xfireTest;
  2.  
  3. public interface XFireTestService {
  4. public String test(String cont);
  5. }

实现类:
  1. package xfireTest.xfireTestImp;
  2. import xfireTest.XFireTestService;
  3.  
  4. public class XFireTestImp implements XFireTestService {
  5.  
  6. @Override
  7. public String test(String cont) {
  8. cont = "webService收到消息:" + cont;
  9. return cont;
  10. }
  11. }

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

然后是另外一个项目中模拟客户端调用代码,同样是需要先创建和服务端一样的服务接口:
  1. package test;
  2.  
  3. public interface XFireTestService {
  4. public String test(String cont);
  5. }

然后是调用:
  1. package test;
  2.  
  3. import org.codehaus.xfire.XFireFactory;
  4. import org.codehaus.xfire.client.XFireProxyFactory;
  5. import org.codehaus.xfire.service.Service;
  6. import org.codehaus.xfire.service.binding.ObjectServiceFactory;
  7.  
  8. public class CallWebServiceTest1 {
  9. public static void main(String[] args) {
  10. Service srModel = new ObjectServiceFactory()
  11. .create(XFireTestService.class);
  12. XFireProxyFactory factory = new XFireProxyFactory(XFireFactory
  13. .newInstance().getXFire());// 创建工厂实例
  14.  
  15. String helloURL = "http://localhost:8082/xfireTest/services/XFireTest";
  16. try {
  17. XFireTestService service = (XFireTestService) factory.create(
  18. srModel, helloURL);
  19. System.out.println(service.test("测试"));
  20. } catch (Exception e) {
  21. throw new RuntimeException(e);
  22. }
  23. }
  24. }

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


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

这个测试,我写了一个简单的UserModel类,用来当做参数使用,根据网上的一些资料,我给实体类做了序列化,如下:
  1. package xfireTest;
  2. import java.io.Serializable;
  3. public class UserModel implements Serializable {
  4.  
  5. /**
  6. *
  7. */
  8. private static final long serialVersionUID = -8344776127885486411L;
  9.  
  10. public UserModel() {
  11. super();
  12. }
  13.  
  14. public UserModel(String userName, int age) {
  15. super();
  16. this.userName = userName;
  17. this.age = age;
  18. }
  19.  
  20. /**
  21. * 用户名
  22. */
  23. private String userName;
  24. /**
  25. * 用户年龄
  26. */
  27. private int age;
  28.  
  29. public String getUserName() {
  30. return userName;
  31. }
  32.  
  33. public void setUserName(String userName) {
  34. this.userName = userName;
  35. }
  36.  
  37. public int getAge() {
  38. return age;
  39. }
  40.  
  41. public void setAge(int age) {
  42. this.age = age;
  43. }
  44.  
  45. @Override
  46. public String toString() {
  47. return "UserModel [userName=" + userName + ", age=" + age + "]";
  48. }
  49. }

然后是对应的接口:
  1. package xfireTest;
  2. import javax.jws.WebParam;
  3. import javax.jws.WebService;
  4.  
  5. @WebService(serviceName = "UserService", targetNamespace = "http://xfireTest/UserService")
  6. public interface UserService {
  7. public UserModel addUser(@WebParam(name = "user") UserModel user);
  8. }

实现类:
  1. package xfireTest.xfireTestImp;
  2. import xfireTest.UserModel;
  3. import xfireTest.UserService;
  4. public class UserServiceImp implements UserService {
  5.  
  6. @Override
  7. public UserModel addUser(UserModel user) {
  8. // System.out.println(user);
  9. System.out.println(user.getUserName() + ":" + user.getAge());
  10. return user;
  11. }
  12. }

services.xml中加入如下代码:
  1. <service xmlns="http://xfire.codehaus.org/config/1.0">
  2. <!-- webService服务的名称 -->
  3. <name>UserService</name>
  4. <namespace>http://xfireTest/UserService</namespace>
  5. <!-- 自己所写的接口路径 -->
  6. <serviceClass>
  7. xfireTest.UserService
  8. </serviceClass>
  9. <!-- 实现类路径 -->
  10. <implementationClass>
  11. xfireTest.xfireTestImp.UserServiceImp
  12. </implementationClass>
  13. </service>

然后是客户端调用的代码:
  1. package test;
  2. import org.codehaus.xfire.XFireFactory;
  3. import org.codehaus.xfire.client.XFireProxyFactory;
  4. import org.codehaus.xfire.service.Service;
  5. import org.codehaus.xfire.service.binding.ObjectServiceFactory;
  6.  
  7. public class CallWebServiceTest2 {
  8.  
  9. public static void main(String[] args) {
  10. Service srModel = new ObjectServiceFactory().create(UserService.class);
  11. XFireProxyFactory factory = new XFireProxyFactory(XFireFactory
  12. .newInstance().getXFire());// 创建工厂实例
  13.  
  14. String helloURL = "http://localhost:8082/xfireTest/services/UserService";
  15. try {
  16. UserService service = (UserService) factory.create(srModel,
  17. helloURL);
  18. UserModel user = new UserModel();
  19. user.setAge(22);
  20. user.setUserName("test");
  21. System.out.println(service.addUser(user));
  22. } catch (Exception e) {
  23. throw new RuntimeException(e);
  24. }
  25.  
  26. }
  27. }

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

接口:
  1. package test;
  2. import javax.jws.WebParam;
  3. import javax.jws.WebService;
  4.  
  5. @WebService(serviceName = "UserService", targetNamespace = "http://xfireTest/UserService")
  6. public interface UserService {
  7. public UserModel addUser(@WebParam(name = "user") UserModel user);
  8. }

UserModel类:
  1. package test;
  2. import java.io.Serializable;
  3. public class UserModel implements Serializable {
  4.  
  5. /**
  6. *
  7. */
  8. private static final long serialVersionUID = 9024481738536854407L;
  9.  
  10. public UserModel() {
  11. super();
  12. }
  13.  
  14. public UserModel(String userName, int age) {
  15. super();
  16. this.userName = userName;
  17. this.age = age;
  18. }
  19.  
  20. /**
  21. * 用户名
  22. */
  23. private String userName;
  24. /**
  25. * 用户年龄
  26. */
  27. private int age;
  28.  
  29. public String getUserName() {
  30. return userName;
  31. }
  32.  
  33. public void setUserName(String userName) {
  34. this.userName = userName;
  35. }
  36.  
  37. public int getAge() {
  38. return age;
  39. }
  40.  
  41. public void setAge(int age) {
  42. this.age = age;
  43. }
  44.  
  45. @Override
  46. public String toString() {
  47. return "UserModel [userName=" + userName + ", age=" + age + "]";
  48. }
  49. }

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


于是又查了许多资料,并在项目老大的帮助下找到了原因。竟然是因为我客户端的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 部署到Nginx

    在网上搜了很多篇Django+uwsgi+Nginx的部署文章,忙了一下午头昏脑胀,最终完成了部署.部署文章流程讲解都很好,但在细节上或许缺乏一些注意力,导致我多篇文章来回切换在字里行间寻找蛛丝马迹. ...

  2. django xadmin 集成DjangoUeditor富文本编辑器

    本文档记录自己的学习历程! 介绍 Ueditor HTML编辑器是百度开源的在线HTML编辑器,功能非常强大 额外功能 解决图片视频等无法上传显示问题 Ueditor下载地址 https://gith ...

  3. How to get started with GIT and work with GIT Remote Repo

    https://www.ntu.edu.sg/home/ehchua/programming/howto/Git_HowTo.html#zz-7. 1.  Introduction GIT is a ...

  4. java Object类是可以接收集合类型的

    废话不多说,上代码: package com.core.test; import java.util.ArrayList; import java.util.HashMap; import java. ...

  5. 将常用的Android adb shell 命令行封装为C#静态函数

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 简介:adb命令是常用的Android命令行,自动化.代码调试.手工排查问题都会用的到,这里将常用的一些命令行封装 ...

  6. Selenium UI自动化解决iframe定位问题

      更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6735116.html 一个阴雨霏霏 ...

  7. SSD写入放大问题[转]

    原文地址:http://blog.csdn.net/cywosp/article/details/29812433 之前在SSD(Solid State Drive)上设计并实现缓存系统用于存储数据块 ...

  8. HDU [P2819] swap

    二分图行列匹配+输出路径 经典题,当且仅当一行匹配一列的时候,符合题意. 本题的难点在于如何输出路径,我们发现这个移动的过程就是将所有匹配选择排序,在选择排序时输出路径即可 #include < ...

  9. BZOJ 1076: [SCOI2008]奖励关 [DP 期望 状压]

    传送门 题意:$n$种宝物,出现$k$次每次一种,每种宝物有价值和吃掉它之前必须要吃掉的宝物的集合,求采取最优策略的期望最大价值 1<=k<=100,1<=n<=15,分值为[ ...

  10. canvas绘制时钟及注释及save和restore的用法

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...