xfire传入传出自定义类型和集合类型-webservice分析

2023-12-17 12:32

本文主要是介绍xfire传入传出自定义类型和集合类型-webservice分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.xfire eclipse插件安装步骤,详细内容见:http://xfire.codehaus.org/Eclipse+Plugin
Overview
The XFire Eclipse plugin provides Eclipse support for XFire's WSDL->Code generator. It requires Eclipse 3.2 and Java 5.
Installing the Plugin

To install the Eclipse XFire plugin:
go to the Help menu, select "Software Updates" and then select "Find and Install."
Select "Search for new features to install" and click Next.
Select "Create New Remote Site" and enter "XFire" as the name and http://dist.codehaus.org/xfire/update/ as the eclipse update site.
Select OK.
Select Finish
Using the Plugin

The first step is to start the code generation wizard. Go to File->New->Other. Then select Code generation from WSDL document.

The plugin will then prompt you for the location of your WSDL, where to output the code, and also what package you would like the service in.

Once you're done you'll see the generated classes in your IDE!

2.基本思路为:
 1.使用eclipse ->new project ->MyEclipse ->J2EE Projects ->Web Service Project创建一个ws服务端工程,默认在web.xml中加入:

  <servlet><servlet-name>XFireServlet</servlet-name><servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class><load-on-startup>0</load-on-startup></servlet><servlet-mapping><servlet-name>XFireServlet</servlet-name><url-pattern>/services/*</url-pattern></servlet-mapping>

 
  同时在类路径下默认加入:XFire 1.1 Core Libraries
 2.ws服务端工程运行,请求services Url,如:
 http://127.0.0.1:8083/xfirelist5/services/HelloWorldService?wsdl,如果看到wsdl内容,表示ws服务工程成功,继续下一步.
 3.ws客户端工程根据xfire eclipse插件,Code generation from WSDL document,然后编写测试类开始测试,调用ws服务工程远程方法。

3.下面以一个具体的例子来说明:
 需求定义:
 服务端提供两个远程服务方法:
 第一个方法:考虑用户对象及该用户的friends List集合对象自定义类型传入传出情况,
 根据传入对象打印出该对象的信息:如编号id,用户名username,密码password,消息msg,friends List集合等,
 假设该用户提交的信息给服务端验证审核,审核完毕后,修改该用户的消息msg,同时新建friends List集合封装该对象返回。
 第二个方法:仅仅考虑该用户对象集合传入传出情况,不考虑该用户的friends List集合对象,
 假设有一批考生user List提交到服务器,服务器端循环输出,然后循环遍历修改该用户的消息msg,提示"考试通过"。

4.服务端主要代码:
 User.java (Model类)

 private int id;private String username;private String password;private String msg; //从服务端获取消息private List<User> friends=new ArrayList<User>();

 
 分别提供get~(),set~()方法.
 HelloWorldService.java (服务接口)

/*** xfire传入传出自定义类型示例* @param user* @return User Object*/User helloWorldDetail(User user);/*** xfire传入传出集合类型示例* @param list* @return List<User>集合*/List<User> listHelloWorld(List<User> list);

  

注意:必须写成List<User> 如果为List,在生成wsdl文件时会报错
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'HelloService' defined in class path resource [META-INF/xfire/services.xml]: Invocation of init method failed; nested exception is org.codehaus.xfire.XFireRuntimeException: Cannot create mapping for java.util.List, unspecified component type for return type of method HelloWorldList in interface org.simpledev.xfire.list.service.IHelloWorldService

  HelloWorldServiceImpl(服务接口实现类)

/*** 考虑用户对象及该用户对象friends集合对象*/public User helloWorldDetail(User user) {System.out.println("HelloWorldServiceImpl.helloWorldDetail()");//================自定义类型传入 begin================System.out.println("客户端传递过来的User对象信息:");int id = user.getId();String username = user.getUsername();String password = user.getPassword();String msg = user.getMsg();System.out.println("id:"+id);System.out.println("username:"+username);System.out.println("password:"+password);System.out.println("msg:"+msg);List<User> friends = user.getFriends();User friend;for (int i = 0; i < friends.size(); i++) {friend=friends.get(i);System.out.println("朋友的编号:"+friend.getId()+"用户名:"+friend.getUsername()+"密码:"+friend.getPassword()+"消息:"+friend.getMsg()+"");}//================自定义类型传入 end================//服务器端确认用户业务逻辑代码//... //服务器端处理完毕后,返回一个User Object//================自定义类型传出 begin================User temp = user;temp.setMsg("恭喜你,你的编号是:"+id+"用户名是:"+username+"密码是:"+password+"已经被服务器端确认!");User friend1 = new User(101,"樱木花道","ymhd","我是新朋友樱木花道");User friend2 = new User(102,"流川 枫","lcf","我是新朋友流川 枫");User friend3 = new User(103,"三井 寿","sjs","我是新朋友三井 寿");User friend4 = new User(104,"宫城良田","gclt","我是新朋友宫城良田");User friend5 = new User(105,"赤木刚宪","ymhd","我是新朋友赤木刚宪");List<User> newfriends = new ArrayList<User>();newfriends.add(friend1);newfriends.add(friend2);newfriends.add(friend3);newfriends.add(friend4);newfriends.add(friend5);temp.setFriends(newfriends);//================自定义类型传出 end================return temp;}/*** 不考虑friends集合情况*/public List<User> listHelloWorld(List<User> list) {System.out.println("HelloWorldServiceImpl.listHelloWorld()");//用户信息批量确认User user;int id;String username;String password;String msg;//================集合类型传入 begin================for (int i = 0; i < list.size(); i++) {user = list.get(i);id = user.getId();username = user.getUsername();password = user.getPassword();msg = user.getMsg();System.out.println("===id为"+id+"信息读取显示开始===");System.out.println("username:"+username);System.out.println("password:"+password);System.out.println("msg:"+msg);}//================集合类型传入 end================//================集合类型传出 begin================List<User> temp = new ArrayList<User>();for (int i = 0; i < list.size(); i++) {user = list.get(i);id = user.getId();user.setMsg("恭喜你,编号"+id+"为已经通过考试了");temp.add(user);}//================集合类型传出 end================return temp;}

  

Web Service Project创建后,services.xml代码默认如下:
<beans xmlns="http://xfire.codehaus.org/config/1.0">
  ...配置
</beans>

org.springframework.beans.factory.BeanDefinitionStoreException: Error registering bean with name '' defined in class path resource [META-INF/xfire/services.xml]: Bean class [list] not found; nested exception is java.lang.ClassNotFoundException: list
java.lang.ClassNotFoundException: list
去掉:xmlns="http://xfire.codehaus.org/config/1.0" <beans>...配置</beans>

services.xml文件完整:
 

<beans><!-- 使用Spring方式配置 --><bean name="HelloService" class="org.codehaus.xfire.spring.ServiceBean"><property name="serviceBean" ref="echo" /><property name="serviceClass" value="org.simpledev.xfire.list.HelloWorldService" /><property name="inHandlers"><list><ref bean="addressingHandler" /></list></property></bean><bean id="echo" class="org.simpledev.xfire.list.HelloWorldServiceImpl" /><bean id="addressingHandler" class="org.codehaus.xfire.addressing.AddressingInHandler" />
</beans>

 

5.客户端主要代码:(注意:根据wsdl生成代码后,还需要httpclient.jar支持)

 public static void main(String[] args) {HelloWorldServiceClient client = new HelloWorldServiceClient();HelloWorldServicePortType service = client.getHelloWorldServiceHttpPort();System.out.println("########### 方法1 ###########");//QName参考: User.javaUser user = new User();
//     JAXBElement<Integer> id = new JAXBElement<Integer>(new
//             QName("http://list.xfire.simpledev.org", "id"),Integer.class,1);JAXBElement<String> username = new JAXBElement<String>(newQName("http://list.xfire.simpledev.org", "username"),String.class,"simpledev");JAXBElement<String> password = new JAXBElement<String>(newQName("http://list.xfire.simpledev.org", "password"),String.class,"123456");JAXBElement<String> msg = new JAXBElement<String>(newQName("http://list.xfire.simpledev.org", "msg"),String.class,"客户端编号为1的发出请求");//======添加对象friends集合 begin======ArrayOfUser temp = new ArrayOfUser();User friend1 = new User();JAXBElement<String> f_username1 = new JAXBElement<String>(newQName("http://list.xfire.simpledev.org", "username"),String.class,"许文强");JAXBElement<String> f_password1 = new JAXBElement<String>(newQName("http://list.xfire.simpledev.org", "password"),String.class,"xwq");JAXBElement<String> f_msg1 = new JAXBElement<String>(newQName("http://list.xfire.simpledev.org", "msg"),String.class,"上海滩-强哥");friend1.setId(11);friend1.setUsername(f_username1);friend1.setPassword(f_password1);friend1.setMsg(f_msg1);User friend2 = new User();JAXBElement<String> f_username2 = new JAXBElement<String>(newQName("http://list.xfire.simpledev.org", "username"),String.class,"丁力");JAXBElement<String> f_password2 = new JAXBElement<String>(newQName("http://list.xfire.simpledev.org", "password"),String.class,"dl");JAXBElement<String> f_msg2 = new JAXBElement<String>(newQName("http://list.xfire.simpledev.org", "msg"),String.class,"上海滩-阿力");friend2.setId(12);friend2.setUsername(f_username2);friend2.setPassword(f_password2);friend2.setMsg(f_msg2);      temp.getUser().add(friend1);temp.getUser().add(friend2);//======添加对象friends集合 end======JAXBElement<ArrayOfUser> friends = new JAXBElement<ArrayOfUser>(newQName("http://list.xfire.simpledev.org", "friends"),ArrayOfUser.class,temp);//封装User Objectuser.setId(1);user.setUsername(username);user.setPassword(password);user.setMsg(msg);user.setFriends(friends);//请求方法,返回User ObjectUser tempUser = service.helloWorldDetail(user);System.out.println("===下面是从服务器端获取的详细信息===");System.out.println(tempUser.getId());System.out.println(tempUser.getUsername().getValue());System.out.println(tempUser.getPassword().getValue());System.out.println(tempUser.getMsg().getValue());JAXBElement<ArrayOfUser> f = tempUser.getFriends(); //获取新朋友,listArrayOfUser f2 = f.getValue();List f3 = f2.getUser();for (int i = 0; i < f3.size(); i++) {User u = (User)f3.get(i);System.out.println(u.getId());System.out.println(u.getUsername().getValue());System.out.println(u.getPassword().getValue());System.out.println(u.getMsg().getValue());}System.out.println("--------------------------------");System.out.println("########### 方法2 ###########");ArrayOfUser a = new ArrayOfUser();User u1 = new User();JAXBElement<String> u_username1 = new JAXBElement<String>(newQName("http://list.xfire.simpledev.org", "username"),String.class,"本田透");JAXBElement<String> u_password1 = new JAXBElement<String>(newQName("http://list.xfire.simpledev.org", "password"),String.class,"111111");JAXBElement<String> u_msg1 = new JAXBElement<String>(newQName("http://list.xfire.simpledev.org", "msg"),String.class,"序号1:查询考试是否通过?");u1.setId(1);u1.setUsername(u_username1);u1.setPassword(u_password1);u1.setMsg(u_msg1);User u2 = new User();JAXBElement<String> u_username2 = new JAXBElement<String>(newQName("http://list.xfire.simpledev.org", "username"),String.class,"纪纱");JAXBElement<String> u_password2 = new JAXBElement<String>(newQName("http://list.xfire.simpledev.org", "password"),String.class,"222222");JAXBElement<String> u_msg2 = new JAXBElement<String>(newQName("http://list.xfire.simpledev.org", "msg"),String.class,"序号2:查询考试是否通过?");u2.setId(2);u2.setUsername(u_username2);u2.setPassword(u_password2);u2.setMsg(u_msg2);   a.getUser().add(u1);a.getUser().add(u2);ArrayOfUser list = service.listHelloWorld(a);List ls = list.getUser();for (int i = 0; i < ls.size(); i++) {User u = (User)ls.get(i);System.out.println(u.getId());System.out.println(u.getUsername().getValue());System.out.println(u.getPassword().getValue());System.out.println(u.getMsg().getValue());}}

 

6.打印信息如下:
 客户端打印信息如下:
 ########### 方法1 ###########
===下面是从服务器端获取的详细信息===
1
simpledev
123456
恭喜你,你的编号是:1用户名是:simpledev密码是:123456已经被服务器端确认!
101
樱木花道
ymhd
我是新朋友樱木花道
102
流川 枫
lcf
我是新朋友流川 枫
103
三井 寿
sjs
我是新朋友三井 寿
104
宫城良田
gclt
我是新朋友宫城良田
105
赤木刚宪
ymhd
我是新朋友赤木刚宪
--------------------------------
########### 方法2 ###########
1
本田透
111111
恭喜你,编号1为已经通过考试了
2
纪纱
222222
恭喜你,编号2为已经通过考试了

 

服务端打印信息如下:
 HelloWorldServiceImpl.helloWorldDetail()
客户端传递过来的User对象信息:
id:1
username:simpledev
password:123456
msg:客户端编号为1的发出请求
朋友的编号:11用户名:许文强密码:xwq消息:上海滩-强哥
朋友的编号:12用户名:丁力密码:dl消息:上海滩-阿力
HelloWorldServiceImpl.listHelloWorld()
===id为1信息读取显示开始===
username:本田透
password:111111
msg:序号1:查询考试是否通过?
===id为2信息读取显示开始===
username:纪纱
password:222222
msg:序号2:查询考试是否通过?

这篇关于xfire传入传出自定义类型和集合类型-webservice分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/504378

相关文章

IDEA如何将String类型转json格式

《IDEA如何将String类型转json格式》在Java中,字符串字面量中的转义字符会被自动转换,但通过网络获取的字符串可能不会自动转换,为了解决IDEA无法识别JSON字符串的问题,可以在本地对字... 目录问题描述问题原因解决方案总结问题描述最近做项目需要使用Ai生成json,可生成String类型

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Idea调用WebService的关键步骤和注意事项

《Idea调用WebService的关键步骤和注意事项》:本文主要介绍如何在Idea中调用WebService,包括理解WebService的基本概念、获取WSDL文件、阅读和理解WSDL文件、选... 目录前言一、理解WebService的基本概念二、获取WSDL文件三、阅读和理解WSDL文件四、选择对接

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维

Redis连接失败:客户端IP不在白名单中的问题分析与解决方案

《Redis连接失败:客户端IP不在白名单中的问题分析与解决方案》在现代分布式系统中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景,然而,在实际使用过程中,我们可能... 目录一、问题背景二、错误分析1. 错误信息解读2. 根本原因三、解决方案1. 将客户端IP添加到Re

Mysql 中的多表连接和连接类型详解

《Mysql中的多表连接和连接类型详解》这篇文章详细介绍了MySQL中的多表连接及其各种类型,包括内连接、左连接、右连接、全外连接、自连接和交叉连接,通过这些连接方式,可以将分散在不同表中的相关数据... 目录什么是多表连接?1. 内连接(INNER JOIN)2. 左连接(LEFT JOIN 或 LEFT

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

Redis的Hash类型及相关命令小结

《Redis的Hash类型及相关命令小结》edisHash是一种数据结构,用于存储字段和值的映射关系,本文就来介绍一下Redis的Hash类型及相关命令小结,具有一定的参考价值,感兴趣的可以了解一下... 目录HSETHGETHEXISTSHDELHKEYSHVALSHGETALLHMGETHLENHSET

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专

Python中异常类型ValueError使用方法与场景

《Python中异常类型ValueError使用方法与场景》:本文主要介绍Python中的ValueError异常类型,它在处理不合适的值时抛出,并提供如何有效使用ValueError的建议,文中... 目录前言什么是 ValueError?什么时候会用到 ValueError?场景 1: 转换数据类型场景