﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-semovy-文章分类-WebService</title><link>http://www.blogjava.net/WshmAndLily/category/29851.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 10 Mar 2008 10:08:21 GMT</lastBuildDate><pubDate>Mon, 10 Mar 2008 10:08:21 GMT</pubDate><ttl>60</ttl><item><title>myeclipse下用XFire开发webservice</title><link>http://www.blogjava.net/WshmAndLily/articles/184708.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Sat, 08 Mar 2008 09:07:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/184708.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/184708.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/184708.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/184708.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/184708.html</trackback:ping><description><![CDATA[myeclipse下用XFire开发webservice<br />
<br />
1.new-&gt;other-&gt;MyEcplise-&gt;Web Services-&gt;Web Services<br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/wshmandlily/13.jpg" border="0" /><br />
自动在classpath:META-INF/xfire<br />
<br />
下建立services.xml:<br />
<br />
<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;beans xmlns="http://xfire.codehaus.org/config/1.0"&gt;</p>
<p>&nbsp;&lt;service&gt;<br />
&nbsp;&nbsp;&lt;name&gt;UserService&lt;/name&gt;<br />
&nbsp;&nbsp;&lt;serviceClass&gt;com.semovy.service.IUserService&lt;/serviceClass&gt;<br />
&nbsp;&nbsp;&lt;implementationClass&gt;<br />
&nbsp;&nbsp;&nbsp;com.semovy.service.impl.UserServiceImpl<br />
&nbsp;&nbsp;&lt;/implementationClass&gt;<br />
&nbsp;&nbsp;&lt;style&gt;wrapped&lt;/style&gt;<br />
&nbsp;&nbsp;&lt;use&gt;literal&lt;/use&gt;<br />
&nbsp;&nbsp;&lt;scope&gt;application&lt;/scope&gt;<br />
&nbsp;&lt;/service&gt;<br />
&lt;/beans&gt;<br />
</p>
2.在WEB-INF下的web.xml下添加servlet:<br />
<br />
<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee&nbsp;&nbsp; http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"&gt;<br />
&nbsp; &lt;servlet&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;XFireServlet&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;org.codehaus.xfire.transport.http.XFireConfigurableServlet&lt;/servlet-class&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;load-on-startup&gt;0&lt;/load-on-startup&gt;<br />
&nbsp; &lt;/servlet&gt;<br />
&nbsp; &lt;servlet-mapping&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;XFireServlet&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/services/*&lt;/url-pattern&gt;<br />
&nbsp; &lt;/servlet-mapping&gt;<br />
&lt;/web-app&gt;</p>
<p>&nbsp;3.com.semovy.beans下建立测试类User<br />
<br />
User.java<br />
<br />
</p>
<p>package com.semovy.beans;</p>
<p>public class User {</p>
<p>&nbsp;private String id = "";</p>
<p>&nbsp;private String name = "";</p>
<p>&nbsp;private String remark = "";</p>
<p>&nbsp;public User() {<br />
&nbsp;}</p>
<p>&nbsp;public User(String id, String name, String remark) {<br />
&nbsp;&nbsp;this.id = id;<br />
&nbsp;&nbsp;this.name = name;<br />
&nbsp;&nbsp;this.remark = remark;<br />
&nbsp;}</p>
<p>&nbsp;public String getId() {<br />
&nbsp;&nbsp;return id;<br />
&nbsp;}</p>
<p>&nbsp;public void setId(String id) {<br />
&nbsp;&nbsp;this.id = id;<br />
&nbsp;}</p>
<p>&nbsp;public String getName() {<br />
&nbsp;&nbsp;return name;<br />
&nbsp;}</p>
<p>&nbsp;public void setName(String name) {<br />
&nbsp;&nbsp;this.name = name;<br />
&nbsp;}</p>
<p>&nbsp;public String getRemark() {<br />
&nbsp;&nbsp;return remark;<br />
&nbsp;}</p>
<p>&nbsp;public void setRemark(String remark) {<br />
&nbsp;&nbsp;this.remark = remark;<br />
&nbsp;}</p>
<p>&nbsp;public String toString() {<br />
&nbsp;&nbsp;return "Id: " + id + " , name: " + name + " , remark: " + remark + "\n";<br />
&nbsp;}</p>
<p>&nbsp;@Override<br />
&nbsp;public int hashCode() {<br />
&nbsp;&nbsp;final int PRIME = 31;<br />
&nbsp;&nbsp;int result = 1;<br />
&nbsp;&nbsp;result = PRIME * result + ((id == null) ? 0 : id.hashCode());<br />
&nbsp;&nbsp;result = PRIME * result + ((name == null) ? 0 : name.hashCode());<br />
&nbsp;&nbsp;result = PRIME * result + ((remark == null) ? 0 : remark.hashCode());<br />
&nbsp;&nbsp;return result;<br />
&nbsp;}</p>
<p>&nbsp;@Override<br />
&nbsp;public boolean equals(Object obj) {<br />
&nbsp;&nbsp;if (this == obj)<br />
&nbsp;&nbsp;&nbsp;return true;<br />
&nbsp;&nbsp;if (obj == null)<br />
&nbsp;&nbsp;&nbsp;return false;<br />
&nbsp;&nbsp;if (getClass() != obj.getClass())<br />
&nbsp;&nbsp;&nbsp;return false;<br />
&nbsp;&nbsp;final User other = (User) obj;<br />
&nbsp;&nbsp;if (id == null) {<br />
&nbsp;&nbsp;&nbsp;if (other.id != null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;return false;<br />
&nbsp;&nbsp;} else if (!id.equals(other.id))<br />
&nbsp;&nbsp;&nbsp;return false;<br />
&nbsp;&nbsp;if (name == null) {<br />
&nbsp;&nbsp;&nbsp;if (other.name != null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;return false;<br />
&nbsp;&nbsp;} else if (!name.equals(other.name))<br />
&nbsp;&nbsp;&nbsp;return false;<br />
&nbsp;&nbsp;if (remark == null) {<br />
&nbsp;&nbsp;&nbsp;if (other.remark != null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;return false;<br />
&nbsp;&nbsp;} else if (!remark.equals(other.remark))<br />
&nbsp;&nbsp;&nbsp;return false;<br />
&nbsp;&nbsp;return true;<br />
&nbsp;}<br />
&nbsp;<br />
}<br />
<br />
<br />
</p>
在com.semovy.service包下建立服务接口IUserService<br />
<br />
IUserService.java<br />
<br />
<br />
<p>package com.semovy.service;</p>
<p>import java.util.List;</p>
<p>import com.semovy.beans.User;</p>
<p>public interface IUserService {<br />
&nbsp;public abstract String getStringTest(String msg1,String msg2);<br />
&nbsp;public abstract List getStringList();<br />
&nbsp;public abstract List getUsersList();<br />
&nbsp;public abstract User[] getUsersArray();<br />
&nbsp;public abstract String[] getUsersStringArray();<br />
&nbsp;public abstract User getUserById(String id);<br />
&nbsp;public abstract void addUser(User user);<br />
}<br />
这在接口包下建立.与服务接口相同名称的IUserService.aegis.xml<br />
<br />
<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;mappings&gt;<br />
&nbsp; &lt;mapping&gt;&lt;!-- 返回类型是String ,String[]的,参数是String类型的方法不用定义 --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;method name="getStringList"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;return-type&nbsp; componentType="java.lang.String" /&gt;&lt;!-- 返回类型对应集合Collection,数组中的元素的类型 --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/method&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;method name="getUsersList"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&lt;return-type componentType="com.semovy.beans.User"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/method&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;method name="getUsersArray"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&lt;return-type componentType="com.semovy.beans.User"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/method&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;method name="getUserById"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&lt;return-type componentType="com.semovy.beans.User"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/method&gt;&nbsp; <br />
&nbsp;&nbsp; &lt;/mapping&gt;<br />
&lt;/mappings&gt;<br />
</p>
在com.semovy.service.impl包下<br />
<br />
UserServiceImpl.java<br />
<br />
<p>package com.semovy.service.impl;</p>
<p>import java.util.ArrayList;<br />
import java.util.Iterator;<br />
import java.util.List;</p>
<p>import com.semovy.beans.User;<br />
import com.semovy.service.IUserService;</p>
<p>/**<br />
&nbsp;* <br />
&nbsp;* @author semovy<br />
&nbsp;* @version 1.0<br />
&nbsp;* the user service class implemente the IUserService implementation for testing<br />
&nbsp;*/<br />
public class UserServiceImpl implements IUserService {</p>
<p>&nbsp;private List&lt;User&gt; users;<br />
&nbsp;public UserServiceImpl()<br />
&nbsp;{<br />
&nbsp;&nbsp;users = new ArrayList&lt;User&gt;();<br />
&nbsp;&nbsp;users.add(new User("1","semovy","semovy's remark"));<br />
&nbsp;&nbsp;users.add(new User("2","韦善茂","韦善茂的备注"));<br />
&nbsp;&nbsp;users.add(new User("3","superman_wshm","superman_wshm's remark"));<br />
&nbsp;}<br />
&nbsp;/**<br />
&nbsp; * @param msg1 the string msg1<br />
&nbsp; * @param msg2 the string msg2<br />
&nbsp; * <br />
&nbsp; */<br />
&nbsp;public String getStringTest(String msg1,String msg2) {</p>
<p>&nbsp;&nbsp;return "Hello :" + msg1 + " : "&nbsp; + msg2;<br />
&nbsp;}<br />
&nbsp;/**<br />
&nbsp; * @return list the list Collection with some String element<br />
&nbsp; */<br />
&nbsp;public List getStringList()<br />
&nbsp;{<br />
&nbsp;&nbsp;List&lt;String&gt; list = new ArrayList&lt;String&gt;();<br />
&nbsp;&nbsp;list.add("string1");<br />
&nbsp;&nbsp;list.add("字符串2");<br />
&nbsp;&nbsp;list.add("字符串3");<br />
&nbsp;&nbsp;list.add("string4");<br />
&nbsp;&nbsp;return list;<br />
&nbsp;}<br />
&nbsp;/**<br />
&nbsp; * @return all users<br />
&nbsp; */<br />
&nbsp;public List getUsersList() {<br />
&nbsp;&nbsp;return users;<br />
&nbsp;}<br />
&nbsp;/**<br />
&nbsp; * @param id the id of user<br />
&nbsp; * @return the user by specifical id <br />
&nbsp; */<br />
&nbsp;public User getUserById(String id) {<br />
&nbsp;&nbsp;Iterator it = users.iterator();<br />
&nbsp;&nbsp;while(it.hasNext())<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;User user = (User)it.next();<br />
&nbsp;&nbsp;&nbsp;if(user.getId().equals(id))<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;return user;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return null;<br />
&nbsp;}<br />
&nbsp;/**<br />
&nbsp; * @return return all users of array form with type User.<br />
&nbsp; */<br />
&nbsp;public User[] getUsersArray() {<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;return users.toArray(new User[]{new User()});<br />
&nbsp;}<br />
&nbsp;/**<br />
&nbsp; * @return return all users of array form with type String<br />
&nbsp; */<br />
&nbsp;public String[] getUsersStringArray() {<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;User[] users_arr = (User[])users.toArray(new User[]{});<br />
&nbsp;&nbsp;String[] tempUser_arr = new String[users_arr.length];<br />
&nbsp;&nbsp;for(int i=0;i&lt;users_arr.length;i++)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;tempUser_arr[i] = users_arr[i].toString();<br />
&nbsp;&nbsp;&nbsp;System.out.println(tempUser_arr[i]);<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return tempUser_arr;<br />
&nbsp;}<br />
&nbsp;public void addUser(User user) {<br />
&nbsp;&nbsp;users.add(user);<br />
&nbsp;}<br />
&nbsp;<br />
}<br />
</p>
<br />
4.在com.semovy.test包下<br />
建立客户调用测试类.UserServiceWSTest .java<br />
<br />
<p>package com.semovy.test;</p>
<p>import java.net.MalformedURLException;<br />
import java.util.Iterator;<br />
import java.util.List;</p>
<p>import org.codehaus.xfire.XFireFactory;<br />
import org.codehaus.xfire.client.XFireProxyFactory;<br />
import org.codehaus.xfire.service.Service;<br />
import org.codehaus.xfire.service.binding.ObjectServiceFactory;</p>
<p>import com.semovy.beans.User;<br />
import com.semovy.service.IUserService;</p>
<p>public class UserServiceWSTest {<br />
&nbsp;public static void main(String[] args) {<br />
&nbsp;&nbsp;// 创建服务实例<br />
&nbsp;&nbsp;Service srvcModel = new ObjectServiceFactory()<br />
&nbsp;&nbsp;&nbsp;&nbsp;.create(IUserService.class);<br />
&nbsp;&nbsp;XFireProxyFactory factory = // 创建代理工厂实例<br />
&nbsp;&nbsp;new XFireProxyFactory(XFireFactory.newInstance().getXFire());<br />
&nbsp;&nbsp;String helloWorldURL = "http://localhost:8000/webServiceTest/services/UserService";<br />
&nbsp;&nbsp;IUserService srvc = null;<br />
&nbsp;&nbsp;try { // 获取指定位置的web服务对象<br />
&nbsp;&nbsp;&nbsp;srvc = (IUserService) factory.create(srvcModel, helloWorldURL);<br />
&nbsp;&nbsp;} catch (MalformedURLException e) {<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;//调用只返回String的方法.在接口名.aegis.xml中不用设置方法名<br />
&nbsp;&nbsp;String result = srvc.getStringTest("msg1", "msg2");<br />
&nbsp;&nbsp;System.out.println(result);<br />
&nbsp;&nbsp;//调用返回String[]数组的方法,在接口名.aegis.xml中不用设置方法名.<br />
&nbsp;&nbsp;String[] userInfo_str_arr = srvc.getUsersStringArray();<br />
&nbsp;&nbsp;for(String aUserInfo:userInfo_str_arr)<br />
&nbsp;&nbsp;&nbsp;System.out.println(aUserInfo);<br />
&nbsp;&nbsp;//调用返回List类型值的方法,需要定义,List容器中的元素类型为String<br />
&nbsp;&nbsp;List strList = srvc.getStringList();<br />
&nbsp;&nbsp;Iterator str_it = strList.iterator();<br />
&nbsp;&nbsp;while (str_it.hasNext()) {<br />
&nbsp;&nbsp;&nbsp;String str = (String) str_it.next();<br />
&nbsp;&nbsp;&nbsp;System.out.println(str);<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;//调用返回User[]数组<br />
&nbsp;&nbsp;User[] user_arr = srvc.getUsersArray();<br />
&nbsp;&nbsp;for (User a_user : user_arr)<br />
&nbsp;&nbsp;&nbsp;System.out.print(a_user.toString());<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;//调用返回User类型值的方法.方法参数是字符串.<br />
&nbsp;&nbsp;User a_user = srvc.getUserById("2");<br />
&nbsp;&nbsp;System.out.print(a_user.toString());<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;//调用参数为User的方法,没有返回值,不用配置方法<br />
&nbsp;&nbsp;srvc.addUser(new User("4","添加的名称","添加的备注"));<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;//调用返回List类型值的方法,需要定义,List容器中的元素类型为User<br />
&nbsp;&nbsp;List userList = srvc.getUsersList();<br />
&nbsp;&nbsp;Iterator userList_it = userList.iterator();<br />
&nbsp;&nbsp;while (userList_it.hasNext()) {<br />
&nbsp;&nbsp;&nbsp;User user = (User) userList_it.next();<br />
&nbsp;&nbsp;&nbsp;System.out.print(user.toString());<br />
&nbsp;&nbsp;}<br />
&nbsp;}</p>
<p>}<br />
5.结果:<br />
Hello :msg1 : msg2<br />
Id: 1 , name: semovy , remark: semovy's remark<br />
Id: 2 , name: 韦善茂 , remark: 韦善茂的备注<br />
Id: 3 , name: superman_wshm , remark: superman_wshm's remark<br />
string1<br />
字符串2<br />
字符串3<br />
string4<br />
Id: 1 , name: semovy , remark: semovy's remark<br />
Id: 2 , name: 韦善茂 , remark: 韦善茂的备注<br />
Id: 3 , name: superman_wshm , remark: superman_wshm's remark<br />
Id: 2 , name: 韦善茂 , remark: 韦善茂的备注<br />
Id: 1 , name: semovy , remark: semovy's remark<br />
Id: 2 , name: 韦善茂 , remark: 韦善茂的备注<br />
Id: 3 , name: superman_wshm , remark: superman_wshm's remark<br />
Id: 4 , name: 添加的名称 , remark: 添加的备注<br />
<br />
</p>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/184708.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2008-03-08 17:07 <a href="http://www.blogjava.net/WshmAndLily/articles/184708.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Xfire返回List类型的详细测试</title><link>http://www.blogjava.net/WshmAndLily/articles/183418.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Mon, 03 Mar 2008 03:28:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/183418.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/183418.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/183418.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/183418.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/183418.html</trackback:ping><description><![CDATA[工作需要，昨天开始学习Xfire，方便是感到很方便，但是对于他的默认绑定配置，始终有些模糊，尤其是List以及数组相关的。今天谢了一个关于返回List的具体调用测试，应该算比较全了，大家共享。 <br />
<br />
业务假设是根据billno，查询数据库，得到ResultSet结果，然后将ResultSet包装成List返回。 <br />
<br />
server端： <br />
public &nbsp; interface &nbsp; IgetInfo &nbsp; { <br />
//每一条记录作为一个String[]，存放与List中 <br />
public &nbsp; List &lt;String[]&gt; &nbsp; getListOfStringArrays(String &nbsp; billno); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //每一条记录合并为一个String，存放与List中 <br />
public &nbsp; List &lt;String&gt; &nbsp; getListOfString(String &nbsp; billno); <br />
//已String[]的形式只返回一条记录 <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public &nbsp; String[] &nbsp; getStringArrays(String &nbsp; billno); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //和第一个方法类似，只是将String[]改成List <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public &nbsp; List &lt;List&gt; &nbsp; getListOfList(String &nbsp; billno); <br />
} <br />
具体实现类就不写了，相应的IgetInfo.aegis.xml如下： <br />
&lt;?xml &nbsp; version= "1.0 " &nbsp; encoding= "UTF-8 "?&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&lt;mappings&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &lt;mapping &nbsp; &gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;method &nbsp; name= "getListOfStringArrays "&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;!--注意，此处的componentType我试过各种类型，均不行，不知道为何 <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 用String报造型错误--&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;return-type &nbsp; componentType= "java.lang.String "/&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;/method&gt; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;method &nbsp; name= "getListOfString "&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;return-type &nbsp; componentType= "java.lang.String "/&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;/method&gt; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;method &nbsp; name= "getStringArrays "&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;return-type &nbsp; componentType= "java.lang.String "/&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;/method&gt; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;method &nbsp; name= "getListOfList "&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;return-type &nbsp; componentType= "#someArrays "/&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;/method&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;component &nbsp; name= &nbsp; "someArrays " &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; class= &nbsp; "java.util.List " &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; componentType= &nbsp; "java.lang.String " &nbsp; /&gt; <br />
&nbsp; &nbsp; &lt;/mapping&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&lt;/mappings&gt; <br />
<br />
client调用就不写了，也很简单。奇怪的就是第一种List &lt;String[]&gt; 返回类型。感觉上应该这么写 <br />
&lt;method &nbsp; name= "XXX "&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;return-type &nbsp; componentType= "#YYY "/&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;/method&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;component &nbsp; name= &nbsp; "YYY " &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; class= &nbsp; "java.util.Arrays " &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; componentType= &nbsp; "java.lang.String " &nbsp; /&gt; <br />
但仍然出错。谁给指教一下？
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/183418.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2008-03-03 11:28 <a href="http://www.blogjava.net/WshmAndLily/articles/183418.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XFire传入传出自定义类型和集合类型学习笔记</title><link>http://www.blogjava.net/WshmAndLily/articles/183417.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Mon, 03 Mar 2008 03:27:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/183417.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/183417.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/183417.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/183417.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/183417.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 工程结构图首先建立一个web工程作为Service端，在classpath中加载XFire Jar包，并编写web.xml如下&lt;?xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"?&gt;&lt;web-app&nbsp;version="2.4"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns="http...&nbsp;&nbsp;<a href='http://www.blogjava.net/WshmAndLily/articles/183417.html'>阅读全文</a><img src ="http://www.blogjava.net/WshmAndLily/aggbug/183417.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2008-03-03 11:27 <a href="http://www.blogjava.net/WshmAndLily/articles/183417.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XFire Web Service验证方案 </title><link>http://www.blogjava.net/WshmAndLily/articles/183416.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Mon, 03 Mar 2008 03:26:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/183416.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/183416.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/183416.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/183416.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/183416.html</trackback:ping><description><![CDATA[<div>XFire的文档做的真是相当的烂，非常不详细，看得匪夷所思，而且和发行的代码版本相当的不匹配，里面的示例根本无法运行，看得真是&#8230;&#8230;相当窝火</div>
<br />
<div>公司项目XFire的服务框架我已经做好，这两天就要加入验证功能，而且要和整体权限框架（还没做）相结合</div>
<div>开始想通过HttpSession验证，这样可以很方便的和b/s的权限系统相统一，但实在不知道如何在客户端通过Spring或XFire访问HttpSession，XFire里的文档倒是提到了：</div>
<div><span class="Code">HttpServletRequest request = XFireServletController.getRequest();<br />
HttpServletResponse response = XFireServletController.getResponse();</span><br />
</div>
<div>并且说只要在web.xml里配置XFireSpringServlet就可以，可是按照配了，结果还是不行</div>
<div>注：axis好像是有MessageContext可以很方便的访问到，xfire里也有MessageContext，可是getSession()出来的是null</div>
<div>如果有高手知道如何做还望麻烦告知</div>
<div><br />
此条路不通只好去查XFire的文档关于authentication部分，大概有以下几种方案：</div>
<ol>
    <li>
    <div>HTTP Authentication</div>
    <li>
    <div>SOAP Header authentication with JSR181</div>
    <li>
    <div>SOAP authentication with handlers</div>
    <li>
    <div>WS-Security</div>
    </li>
</ol>
<div>其中第一条HTTP Authentication的文档写的相当匪夷所思，文档写到如何在客户端指定用户名和密码</div>
<pre class="code-java"><span class="Code"><span class="code-comment">// Create your client<br />
</span>Client client = ....;<br />
<br />
<span class="code-comment">// Or get it from your proxy<br />
</span>Client client = ((XFireProxy) Proxy.getInvocationHandler(myClientProxy)).getClient(); <br />
<br />
client.setProperty(Channel.USERNAME, <span class="code-quote">"username"</span>);<br />
client.setProperty(Channel.PASSWORD, <span class="code-quote">"pass"</span>);<br />
</span></pre>
<p>去忘了写服务端应该怎么做，这个username和password该在那里验证呢？？我翻遍了文档也没找着</p>
<p><br />
来看第二条SOAP header authentication with JSR181，看起来倒是很简单</p>
<p>但是在Service的代码中每个方法里都要写一个UserToken验证的参数，虽然似乎权限粒度能控制得很细，但是这严重污染了业务逻辑的代码，非常的不优雅，放弃！</p>
<br />
<p><span class="code-keyword">public</span> void someOperation(<span class="code-object">String</span> data, @WebParam(header=<span class="code-keyword">true</span>) UserToken token) {<br />
authenticate(token)<br />
<br />
<span class="code-comment">// <span class="code-keyword">do</span> your normal request here<br />
</span>}<br />
<br />
再看WS-Security，这是webservice的安全标准，但实在太复杂了，并且需要配置Service.xml，我们项目是Java1.5，Service.xml根本就没有写，是自动生成的，我是实在找不到Service.xml该在那配置？只好作罢</p>
<br />
<div>现在只剩下SOAP authentication with handlers，根据文档来看这是能够满足我的要求的，不侵入业务逻辑，能够和整体权限系统相结合，并且配置比较简单</div>
<div>把例子里的代码拷过来，发现根本不能用，少了yom这个包，在网上找了很久也没找到，后来发现yom其实就是yet(another) document object model，原来和dom是一回事嘛，用jdom替换，编译通过。<br />
<br />
文档里遗漏了很重要的一点，就是关于如何在xfire-servlet里配置，导致很多人看了文档也进行不下去，我查了很久才在老外的一篇blog里找到一点tips，下面是配置：<br />
&nbsp;&nbsp;&nbsp; &lt;!-- WebService base, do not modify it --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;bean id="webService" class="org.codehaus.xfire.spring.remoting.XFireExporter" abstract="true"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;property name="serviceFactory"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;ref bean="xfire.serviceFactory" /&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;property name="xfire"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;ref bean="xfire" /&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; &lt;bean id="yourWebService" parent="webService"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;property name="serviceBean"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;ref bean="yourService" /&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;property name="serviceClass"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;value&gt;your.package.YourServiceInterface&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;property name="inHandlers"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;ref bean="authenticationHandler"/&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
</div>
<p>AuthenticationHandler需要修改一下，其他不用变：</p>
<p>AuthenticationHandler.java<br />
</p>
<p><span class="Code">import org.apache.log4j.Logger;<br />
import org.codehaus.xfire.MessageContext;<br />
import org.codehaus.xfire.handler.AbstractHandler;<br />
import org.codehaus.xfire.fault.*;<br />
import org.jdom.*;<br />
<br />
public class AuthenticationHandler extends AbstractHandler {<br />
&nbsp;&nbsp;&nbsp; private static final Logger log = Logger.getLogger(AuthenticationHandler.class);<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public void invoke(MessageContext context) throws Exception {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.info("authentication handler is invoked");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (context.getInMessage().getHeader() == null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new XFireFault("Request must include company authentication token.", <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XFireFault.SENDER);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element header = context.getInMessage().getHeader();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element token = header.getChild("AuthenticationToken");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (token == null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new XFireFault("Request must include authentication token.", <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XFireFault.SENDER);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String username = token.getChild("Username").getText();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String password = token.getChild("Password").getText();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 现在你已经得到了客户端传来的username和password，那就验证它吧（可以交给acegi来验证）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(Exception e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.warn(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new XFireFault("Authentication Failed.", <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XFireFault.SENDER);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}</span></p>
<p>客户端代码：<br />
</p>
<div>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Service serviceModel = new ObjectServiceFactory().create(YourService.class);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; YourService service = (YourService) new XFireProxyFactory().create(serviceModel,<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "http://localhost:8080/YourProject/service/YourService");<br />
</div>
<div>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; XFireProxy proxy = (XFireProxy)Proxy.getInvocationHandler(service);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Client client = proxy.getClient();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.addOutHandler(new ClientAuthHandler("jeffrey", "killjava"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 执行下面代码会进行验证<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; service.someOperation();<br />
</div>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/183416.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2008-03-03 11:26 <a href="http://www.blogjava.net/WshmAndLily/articles/183416.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[webservices开发]XFire在SpringSide中的应用 </title><link>http://www.blogjava.net/WshmAndLily/articles/183415.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Mon, 03 Mar 2008 03:25:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/183415.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/183415.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/183415.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/183415.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/183415.html</trackback:ping><description><![CDATA[<p style="text-indent: 21pt; line-height: 150%"><span style="font-family: 宋体">SpringSide</span><span style="font-family: 宋体">开源项目是国内的开发人员所做的一个以Spring为核心的开源项目,目的是</span><span style="font-family: 宋体">提供一个</span>Pragmatic<span style="font-family: 宋体">的企业应用开发基础和最佳实践展示。为使用</span>Spring<span style="font-family: 宋体">框架的开发者提供一个非</span>Demo<span style="font-family: 宋体">版的复杂、正式而体现最佳使用实践的参照系统。为</span>JavaEEer<span style="font-family: 宋体">必须面对的所有问题提供合理的、合乎</span>Pragmatic<span style="font-family: 宋体">原则的解决方案。采用</span>Plugins<span style="font-family: 宋体">形式组织，使开发者可快速定位所需的参考方案并做加法到自己的系统。</span></p>
<p style="text-indent: 21pt; line-height: 150%"><span style="font-family: 宋体">SpringSide</span><span style="font-family: 宋体">中关于Web服务的配置是在</span></p>
<p style="text-indent: 21pt; line-height: 150%"><span style="font-family: 宋体">WEB-IBF/classes</span><span style="font-family: 宋体">文件下的applicationContext-webservice.xml中配置的：</span></p>
<table style="border-right: medium none; border-top: medium none; border-left: medium none; border-bottom: medium none; border-collapse: collapse" cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 426.1pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="568">
            <p><span style="font-family: 宋体">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</span></p>
            <p><span style="font-family: 宋体">&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&gt;</span></p>
            <p><span style="font-family: 宋体">&lt;beans&gt;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;import resource="classpath:org/codehaus/xfire/spring/xfire.xml"/&gt;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"&gt;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="mappings"&gt;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;/BookService=bookService&lt;/value&gt;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;/bean&gt;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;bean id="baseWebService" class="org.codehaus.xfire.spring.remoting.XFireExporter" abstract="true"&gt;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="serviceFactory" ref="xfire.serviceFactory"/&gt;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="xfire" ref="xfire"/&gt;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;/bean&gt;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; </span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;bean id="bookService" parent="baseWebService"&gt;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="serviceBean" ref="bookManager"/&gt;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="serviceClass" value="org.springside.bookstore.service.webservice.BookService"/&gt;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;/bean&gt;</span></p>
            <p><span style="font-family: 宋体">&lt;/beans&gt;</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-indent: 21pt; line-height: 150%"><span style="font-family: 宋体">第一步，引入xfire.xml文件</span></p>
<p style="text-indent: 21pt; line-height: 150%"><span style="font-family: 宋体">&lt;import resource="classpath:org/codehaus/xfire/spring/xfire.xml"/&gt;</span><span style="font-family: 宋体">。这样，我们就不必在web.xml中配置了,这种语法在Spring参考手册（2.0-M3）3.18节中有介绍，3.19节介绍了在web.xml配置bean定义文件的方法，就是上一节使用的方法。</span></p>
<p style="text-indent: 21pt; line-height: 150%"><span style="font-family: 宋体">第二步，处理映射，将/BookService URL和bookService这个bean联系起来。当然，这里bookService又继承了baseWebService，这样做挺巧妙，这样如果有多个Web服务bean，就继承baseWebService就可以了，这种面向对象的概念还是值得我们提倡的，Spring参考手册3.5节介绍了相关的知识。</span></p>
<p style="text-indent: 21pt; line-height: 150%"><span style="font-family: 宋体">在bookService的定义中，serviceBean也就是接口实现类为bookManager bean，这个bean实际是在WEB-INF/classes/</span><span style="font-family: 宋体">applicationContext-manager.xml</span><span style="font-family: 宋体">文件中所定义，类名为org.springside.bookstore.service.logic.BookManager：</span></p>
<table style="border-right: medium none; border-top: medium none; border-left: medium none; border-bottom: medium none; border-collapse: collapse" cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 426.1pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="568">
            <p><span style="font-family: 宋体">package org.springside.bookstore.service.logic;</span></p>
            <p><span style="font-family: 宋体">import &#8230; &#8230;</span></p>
            <p><span style="font-family: 宋体">public class BookManager extends BaseHibernateDao implements BookService {</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; private CategoryManager categoryManager;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; public void setCategoryManager(CategoryManager categoryManager) {</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.categoryManager = categoryManager;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; protected Class getEntityClass() {</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230; &#8230;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; public Book get(Integer id) {</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230; &#8230;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; public void save(Book book) {</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230; &#8230;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; public void remove(Integer id) {</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230; &#8230;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; public List getAllCategorys() {</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230; &#8230;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; public Category getCategory(Integer id) {</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230; &#8230;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span></p>
            <p><span style="font-family: 宋体">&nbsp;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; public List findBooksByName(String name) {</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230; &#8230;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp; </span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; public List getNewBooks() {</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230; &#8230;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span></p>
            <p><span style="font-family: 宋体">&nbsp;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; public List findAllLowStock(Integer stockHint) {</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230; &#8230;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; public List findBooksByCategory(String category_id) {</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230; &#8230;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span></p>
            <p><span style="font-family: 宋体">&nbsp;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; protected void filterCriteria(Criteria criteria, Map filter) {</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230; &#8230;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span></p>
            <p><span style="font-family: 宋体">}</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-indent: 21pt; line-height: 150%"><span style="font-family: 宋体">serviceClass</span><span style="font-family: 宋体">也就是接口类为</span></p>
<p style="text-indent: 21pt; line-height: 150%"><span style="font-family: 宋体">org.springside.bookstore.service.webservice.BookService</span><span style="font-family: 宋体">：</span></p>
<table style="border-right: medium none; border-top: medium none; border-left: medium none; border-bottom: medium none; border-collapse: collapse" cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 426.1pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="568">
            <p><span style="font-family: 宋体">package org.springside.bookstore.service.webservice;</span></p>
            <p><span style="font-family: 宋体">import java.util.List;</span></p>
            <p><span style="font-family: 宋体">public interface BookService {</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; List findBooksByName(String name);</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp; </span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; List findBooksByCategory(String category);</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; List getAllCategorys();</span></p>
            <p><span style="font-family: 宋体">}</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-indent: 21pt; line-height: 150%"><span style="font-family: 宋体">事实上，SpringSide既是一个Web服务的提供者，又是一个Web服务的消费者。它在WEB-INF/classes/applicationContext-webservice-client.xml文件中定义了消费这个Web服务的bean：</span></p>
<table style="border-right: medium none; border-top: medium none; border-left: medium none; border-bottom: medium none; border-collapse: collapse" cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 426.1pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="568">
            <p><span style="font-family: 宋体">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</span></p>
            <p><span style="font-family: 宋体">&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&gt;</span></p>
            <p><span style="font-family: 宋体">&lt;beans&gt;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;!-- </span><span style="font-family: 宋体">一分钟刷新一次sciprt文件--&gt;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;bean class="org.springframework.scripting.support.ScriptFactoryPostProcessor"&gt;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="refreshCheckDelay" value="60" /&gt;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;/bean&gt;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;bean id="BookServiceClient" class="org.springframework.scripting.groovy.GroovyScriptFactory"&gt;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;constructor-arg value="classpath:org/springside/bookstore/service/webservice/BookServiceClient.groovy"/&gt;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="serviceUrl" value="http://localhost:8080/springside/service/BookService" /&gt;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;/bean&gt;</span></p>
            <p><span style="font-family: 宋体">&lt;/beans&gt;</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-indent: 21pt; line-height: 150%"><span style="font-family: 宋体">这个消费Web服务的bean定义为BookServiceClient，它是采用Groovy脚本语言定义了。在Spring参考手册(2.0-M3)中的第25章专门介绍在Spring中脚本语言的使用，脚本语言支持是Spring 2.0新增的内容,目前可以支持Groovy、BeanShell、Jruby三种脚本语言。</span></p>
<p style="text-indent: 21pt; line-height: 150%"><span style="font-family: 宋体">这个BookServiceClient最终是在dwr中使用，可以</span></p>
<p style="text-indent: 21pt; line-height: 150%"><span style="font-family: 宋体">plugins"org.springside.ajax.dwr"webapp"WEB-INF"dwr.xml</span><span style="font-family: 宋体">中的定义。</span></p>
<p style="text-indent: 21pt; line-height: 150%"><span style="font-family: 宋体">在SpringSide,采用Aegis的binding方式，在</span></p>
<p style="text-indent: 21pt; line-height: 150%"><span style="font-family: 宋体">plugins"org.springside.webservice.xfire"src"org"springside"bookstore"service"webservice"BookService.aegis.xml</span><span style="font-family: 宋体">中定义了返回值的类型：</span></p>
<table style="border-right: medium none; border-top: medium none; border-left: medium none; border-bottom: medium none; border-collapse: collapse" cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 426.1pt; padding-top: 0cm; border-bottom: windowtext 1pt solid" valign="top" width="568">
            <p><span style="font-family: 宋体">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</span></p>
            <p><span style="font-family: 宋体">&lt;mappings&gt;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;mapping&gt;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;method name="findBooksByName"&gt;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;return-type componentType="org.springside.bookstore.domain.Book"/&gt;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/method&gt;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;method name="findBooksByCategory"&gt;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;return-type componentType="org.springside.bookstore.domain.Book"/&gt;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/method&gt;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;method name="getAllCategorys"&gt;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;return-type componentType="org.springside.bookstore.domain.Category"/&gt;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/method&gt;</span></p>
            <p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;/mapping&gt;</span></p>
            <p><span style="font-family: 宋体">&lt;/mappings&gt;</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-indent: 21pt"><span style="font-family: 宋体">XFire</span><span style="font-family: 宋体">在SpringSide中的应用就介绍到这里为止。</span></p>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/183415.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2008-03-03 11:25 <a href="http://www.blogjava.net/WshmAndLily/articles/183415.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Xfire的aegis绑定方式配置小结</title><link>http://www.blogjava.net/WshmAndLily/articles/183413.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Mon, 03 Mar 2008 03:23:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/183413.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/183413.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/183413.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/183413.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/183413.html</trackback:ping><description><![CDATA[<p style="text-indent: 2em">首先说明，aegis为XFire默认的绑定方式，何时需要绑定？ </p>
<p style="text-indent: 2em">当使用JDK1.4时，或者对JDK1.5的范型和注释不是很熟悉的情况下，当遇到需要映射POJO或配置WebService接口方法返回类型(如集合类型)时，需要进行绑定，此时aegis的绑定为建立.aegis.xml的文件。</p>
<p style="text-indent: 2em">1.当封装的接口类中，某方法返回集合类型时，aegis的绑定方式： </p>
<p style="text-indent: 2em">例如，需要将以下接口封装 </p>
<p style="text-indent: 2em">代码</p>
<p style="text-indent: 2em"></p>
<p style="text-indent: 2em"></p>
<ol>
    <li>public&nbsp;interface&nbsp;UserInfo&nbsp;{ &nbsp;&nbsp;
    <li>&nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;User&nbsp;findUserInfosByUserID(String&nbsp;userUniqueID); &nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;test(); &nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Collection&nbsp;findRoleInfosByUserID(String&nbsp;userUniqueID); &nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;
    <li>&nbsp;&nbsp;</li>
</ol>
<p>&nbsp;</p>
<p style="text-indent: 2em">观察此接口，受限我们看findRoleInfosByUserID方法，此方法传入String,返回类型为Collection，此时，我们即需要配置findRoleInfosByUserID方法。 </p>
<p style="text-indent: 2em">配置步骤，在接口类的同一包下建立和接口名相同的aegis.xml文件，即UserInfo.aegis.xml文件。 </p>
<p style="text-indent: 2em">UserInfo.aegis.xml </p>
<p style="text-indent: 2em">代码</p>
<p style="text-indent: 2em"></p>
<p style="text-indent: 2em"></p>
<ol>
    <li>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"?&gt;&nbsp;&nbsp;
    <li>&lt;mappings&gt;&nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;mapping&gt;&nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;method&nbsp;name="findRoleInfosByUserID"&gt;&nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;return-type&nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;componentType="com.tongtech.bjvsp.sysmng.entity.Role"&nbsp;/&gt;&nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/method&gt;&nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/mapping&gt;&nbsp;&nbsp;
    <li>&lt;/mappings&gt;&nbsp;&nbsp;
    <li>&nbsp;&nbsp;</li>
</ol>
<p>&nbsp;</p>
<p style="text-indent: 2em">其中，method代表需要配置的方法名，由于XFire可以支持基本类型，针对集合类型时，需要配置，返回类型或参数类型为基本类型时不需要特殊配置。 </p>
<p style="text-indent: 2em">&lt;return-type/&gt;为配置返回类型，componentType属性代表返回的集合中所包含的类，此类可以是自定义的对象，也可以是基本类型,例如java.lang.String </p>
<p style="text-indent: 2em">此时，findRoleInfosByUserID方法配置完毕 </p>
<p style="text-indent: 2em">PS，还拿此接口举例，如接口中，findRoleInfosByUserID接受的参数也为集合类型，那么需要在&lt;method&gt;&lt;/method&gt;之间再加入以下代码 </p>
<p style="text-indent: 2em">代码</p>
<p style="text-indent: 2em"></p>
<p style="text-indent: 2em"></p>
<ol>
    <li>&lt;parameter&nbsp;index="0"&nbsp;componentType="java.lang.String"/&gt; &nbsp;&nbsp;</li>
</ol>
<p>&nbsp;</p>
<p style="text-indent: 2em">index="0"代表方法的参数的序号，0即第一个参数。 </p>
<p style="text-indent: 2em">componentType代表集合参数内包含的类型，也可以为自定义对象，例如User </p>
<p style="text-indent: 2em">注意，如果findRoleInfosByUserID方法有两个参数，一个比如为String，一个为集合，那么只需要配置集合参数即可。 </p>
<p style="text-indent: 2em">二。映射POJO </p>
<p style="text-indent: 2em">比如还是上面的UserInfo接口，第一个方法 </p>
<p style="text-indent: 2em">public User findUserInfosByUserID(String userUniqueID); </p>
<p style="text-indent: 2em">此时，返回类型为User </p>
<p style="text-indent: 2em">如果User中仅为基本类型，例如String，int等基本类型，无需配置User</p>
<p style="text-indent: 2em">但如果User中还包含有其他类型，比如包含有Set，List，那么需要对其进行配置 </p>
<p style="text-indent: 2em">比如User代码如下： </p>
<p style="text-indent: 2em">代码</p>
<p style="text-indent: 2em"></p>
<p style="text-indent: 2em"></p>
<ol>
    <li>public&nbsp;class&nbsp;User&nbsp;&nbsp;implements&nbsp;java.io.Serializable&nbsp;{ &nbsp;&nbsp;
    <li>&nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Fields&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;
    <li>&nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Integer&nbsp;userId; &nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;loginName; &nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;userPassword; &nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Integer&nbsp;SOrder; &nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;userCa; &nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;userName; &nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;userTel; &nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;userEmail; &nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;ZNote; &nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;userCode; &nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;DicSystemAuth&nbsp;SDicSystemAuth; &nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Set&nbsp;SGroupUsers&nbsp;=&nbsp;new&nbsp;HashSet(0); &nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Set&nbsp;SUserDepts&nbsp;=&nbsp;new&nbsp;HashSet(0); &nbsp;&nbsp;
    <li>} &nbsp;&nbsp;</li>
</ol>
<p>&nbsp;</p>
<p style="text-indent: 2em">此时User中还包含有SDicSystemAuth的对象，以及SUserDepts等Set集合 </p>
<p style="text-indent: 2em">这种情况主要可能会出现在使用Hibernate，映射一对一，一对多表时 </p>
<p style="text-indent: 2em">这里要特别注意 </p>
<p style="text-indent: 2em">那么此时我们需要对User进行aegis绑定，控制POJO和XML的映射 </p>
<p style="text-indent: 2em">配置方法： </p>
<p style="text-indent: 2em">在User对象所在包内建立User.aegis.xml </p>
<p style="text-indent: 2em">由于User中包含Set，那么只需要对集合做设置即可，DicSystemAuth下面单独讨论 </p>
<p style="text-indent: 2em">我们可以分两次来配置，分别讲解 </p>
<p style="text-indent: 2em">1, </p>
<p style="text-indent: 2em">代码</p>
<p style="text-indent: 2em"></p>
<p style="text-indent: 2em"></p>
<ol>
    <li>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"?&gt;&nbsp;&nbsp;
    <li>&lt;mappings&nbsp;xmlns:my="http://my.bjvsp.tongtech.com"&gt;&nbsp;&nbsp;
    <li>&lt;mapping&nbsp;name="my:User"&gt;&nbsp;&nbsp;
    <li>&lt;property&nbsp;name="SGroupUsers"&nbsp;componentType="com.tongtech.bjvsp.sysmng.entity.GroupUser"/&gt;&nbsp;&nbsp;
    <li>&lt;property&nbsp;name="SUserDepts"&nbsp;componentType="com.tongtech.bjvsp.sysmng.entity.UserDept"/&gt;&nbsp;&nbsp;
    <li>&lt;/mapping&gt;&nbsp;&nbsp;
    <li>&lt;/mappings&gt;&nbsp;&nbsp;</li>
</ol>
<p>&nbsp;</p>
<p style="text-indent: 2em">此时，配置文件中配置了两个Set集合，componentType明确定义了Set集合内包含的内容 </p>
<p style="text-indent: 2em">此时，DicSystemAuth即便是自定义的对象类，由于不是集合，XFire也可以对其正确映射。 </p>
<p style="text-indent: 2em">2 </p>
<p style="text-indent: 2em">代码</p>
<p style="text-indent: 2em"></p>
<p style="text-indent: 2em"></p>
<ol>
    <li>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"?&gt;&nbsp;&nbsp;
    <li>&lt;mappings&nbsp;xmlns:my="http://my.bjvsp.tongtech.com"&gt;&nbsp;&nbsp;
    <li>&lt;mapping&nbsp;name="my:User"&gt;&nbsp;&nbsp;
    <li>&nbsp;&nbsp;
    <li>&lt;property&nbsp;name="SGroupUsers"&nbsp;ignore="true"/&gt;&nbsp;&nbsp;
    <li>&lt;property&nbsp;name="SUserDepts"&nbsp;ignore="true"/&gt;&nbsp;&nbsp;
    <li>&lt;property&nbsp;name="SDicSystemAuth"&nbsp;ignore="true"/&gt;&nbsp;&nbsp;
    <li>&lt;/mapping&gt;&nbsp;&nbsp;
    <li>&lt;/mappings&gt;&nbsp;&nbsp;</li>
</ol>
<p>&nbsp;</p>
<p style="text-indent: 2em">第二种方式，定义了三个字段，并使用了ignore属性，表示这三个属性不能被序列化。 </p>
<p style="text-indent: 2em">那么，何时会遇到类似于User中Set集合，不被序列化呢？ </p>
<p style="text-indent: 2em">当客户端访问本地代理时，如果User表内包含有其他表的关联时，如果基于hibernate的持久层，由于hibernate的惰性加载机制，加载User时仅会将User中的属性值加载而不会加载关联表中的值，比如set和SDicSystemAuth对象等，当客户端访问本地代理，序列化User对象时，如果没有设置关联字段是否序列化，那么它会将其全部序列化，但当序列化时，由于hibernate的惰性加载，此时Session已经关闭，那么在序列化关联字段的时候，就会出现session was close的异常。因此解决办法是在aegis绑定时制定关联字段的ignore属性设置为true。</p>
<p style="text-indent: 2em">还有一种解决办法，就是仍然按照第一种配置方式，明确指明关联的Set集合内的对象，但在执行序列化前，session关闭之前，提前将关联字段内的值初始化。 </p>
<p style="text-indent: 2em">用Hibernate.initialize初始化</p>
<p style="text-indent: 2em">最后补充一小句 </p>
<p style="text-indent: 2em">XFire对于自定义的对象可以聪明的找到，前提是它不包含集合 </p>
<p style="text-indent: 2em">例如你的方法返回一个User对象 </p>
<p style="text-indent: 2em">User中都是基本类型，或者User中包含有Dept对象的引用，都没有问题。 </p>
<p style="text-indent: 2em">但如果你不希望加载user时序列化Dept出问题，就乖乖把dept初始化或将dept的ignore属性设置为true</p>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/183413.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2008-03-03 11:23 <a href="http://www.blogjava.net/WshmAndLily/articles/183413.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>