<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service>
<name>UserService</name>
<serviceClass>com.semovy.service.IUserService</serviceClass>
<implementationClass>
com.semovy.service.impl.UserServiceImpl
</implementationClass>
<style>wrapped</style>
<use>literal</use>
<scope>application</scope>
</service>
</beans>
<?xml version="1.0" encoding="UTF-8"?>
<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 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<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>
</web-app>
3.com.semovy.beans下å¾ç«‹æµ‹è¯•ç±»User
User.java
package com.semovy.beans;
public class User {
private String id = "";
private String name = "";
private String remark = "";
public User() {
}
public User(String id, String name, String remark) {
this.id = id;
this.name = name;
this.remark = remark;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public String toString() {
return "Id: " + id + " , name: " + name + " , remark: " + remark + "\n";
}
@Override
public int hashCode() {
final int PRIME = 31;
int result = 1;
result = PRIME * result + ((id == null) ? 0 : id.hashCode());
result = PRIME * result + ((name == null) ? 0 : name.hashCode());
result = PRIME * result + ((remark == null) ? 0 : remark.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final User other = (User) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (remark == null) {
if (other.remark != null)
return false;
} else if (!remark.equals(other.remark))
return false;
return true;
}
}
package com.semovy.service;
import java.util.List;
import com.semovy.beans.User;
public interface IUserService {
public abstract String getStringTest(String msg1,String msg2);
public abstract List getStringList();
public abstract List getUsersList();
public abstract User[] getUsersArray();
public abstract String[] getUsersStringArray();
public abstract User getUserById(String id);
public abstract void addUser(User user);
}
˜q™åœ¨æŽ¥å£åŒ…下建立.与æœåŠ¡æŽ¥å£ç›¸åŒå¿U°çš„IUserService.aegis.xml
<?xml version="1.0" encoding="UTF-8"?>
<mappings>
<mapping><!-- ˜q”回¾cÕdž‹æ˜¯String ,String[]çš?傿•°æ˜¯String¾cÕdž‹çš„æ–¹æ³•ä¸ç”¨å®šä¹?-->
<method name="getStringList">
<return-type componentType="java.lang.String" /><!-- ˜q”回¾cÕdž‹å¯¹åº”集åˆCollection,数组ä¸çš„å…ƒç´ çš„ç±»åž?-->
</method>
<method name="getUsersList">
<return-type componentType="com.semovy.beans.User"/>
</method>
<method name="getUsersArray">
<return-type componentType="com.semovy.beans.User"/>
</method>
<method name="getUserById">
<return-type componentType="com.semovy.beans.User"/>
</method>
</mapping>
</mappings>
package com.semovy.service.impl;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import com.semovy.beans.User;
import com.semovy.service.IUserService;
/**
*
* @author semovy
* @version 1.0
* the user service class implemente the IUserService implementation for testing
*/
public class UserServiceImpl implements IUserService {
private List<User> users;
public UserServiceImpl()
{
users = new ArrayList<User>();
users.add(new User("1","semovy","semovy's remark"));
users.add(new User("2","韦善�,"韦善茂的备注"));
users.add(new User("3","superman_wshm","superman_wshm's remark"));
}
/**
* @param msg1 the string msg1
* @param msg2 the string msg2
*
*/
public String getStringTest(String msg1,String msg2) {
return "Hello :" + msg1 + " : " + msg2;
}
/**
* @return list the list Collection with some String element
*/
public List getStringList()
{
List<String> list = new ArrayList<String>();
list.add("string1");
list.add("å—符ä¸?");
list.add("å—符ä¸?");
list.add("string4");
return list;
}
/**
* @return all users
*/
public List getUsersList() {
return users;
}
/**
* @param id the id of user
* @return the user by specifical id
*/
public User getUserById(String id) {
Iterator it = users.iterator();
while(it.hasNext())
{
User user = (User)it.next();
if(user.getId().equals(id))
{
return user;
}
}
return null;
}
/**
* @return return all users of array form with type User.
*/
public User[] getUsersArray() {
return users.toArray(new User[]{new User()});
}
/**
* @return return all users of array form with type String
*/
public String[] getUsersStringArray() {
User[] users_arr = (User[])users.toArray(new User[]{});
String[] tempUser_arr = new String[users_arr.length];
for(int i=0;i<users_arr.length;i++)
{
tempUser_arr[i] = users_arr[i].toString();
System.out.println(tempUser_arr[i]);
}
return tempUser_arr;
}
public void addUser(User user) {
users.add(user);
}
}
package com.semovy.test;
import java.net.MalformedURLException;
import java.util.Iterator;
import java.util.List;
import org.codehaus.xfire.XFireFactory;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;
import com.semovy.beans.User;
import com.semovy.service.IUserService;
public class UserServiceWSTest {
public static void main(String[] args) {
// åˆ›å¾æœåŠ¡å®žä¾‹
Service srvcModel = new ObjectServiceFactory()
.create(IUserService.class);
XFireProxyFactory factory = // 创å¾ä»£ç†å·¥åŽ‚å®žä¾‹
new XFireProxyFactory(XFireFactory.newInstance().getXFire());
String helloWorldURL = "http://localhost:8000/webServiceTest/services/UserService";
IUserService srvc = null;
try { // èŽ·å–æŒ‡å®šä½ç½®çš„webæœåŠ¡å¯¹è±¡
srvc = (IUserService) factory.create(srvcModel, helloWorldURL);
} catch (MalformedURLException e) {
e.printStackTrace();
}
//调用åªè¿”回String的方æ³?在接å£å.aegis.xmlä¸ä¸ç”¨è®¾¾|®æ–¹æ³•å
String result = srvc.getStringTest("msg1", "msg2");
System.out.println(result);
//调用˜q”回String[]数组的方æ³?在接å£å.aegis.xmlä¸ä¸ç”¨è®¾¾|®æ–¹æ³•å.
String[] userInfo_str_arr = srvc.getUsersStringArray();
for(String aUserInfo:userInfo_str_arr)
System.out.println(aUserInfo);
//调用˜q”回List¾cÕdž‹å€¼çš„æ–ÒŽ³•,需è¦å®šä¹?List容器ä¸çš„å…ƒç´ ¾cÕdž‹ä¸ºString
List strList = srvc.getStringList();
Iterator str_it = strList.iterator();
while (str_it.hasNext()) {
String str = (String) str_it.next();
System.out.println(str);
}
//调用˜q”回User[]数组
User[] user_arr = srvc.getUsersArray();
for (User a_user : user_arr)
System.out.print(a_user.toString());
//调用˜q”回User¾cÕdž‹å€¼çš„æ–ÒŽ³•.æ–ÒŽ³•傿•°æ˜¯å—½W¦ä¸².
User a_user = srvc.getUserById("2");
System.out.print(a_user.toString());
//è°ƒç”¨å‚æ•°ä¸ºUser的方æ³?没有˜q”回å€?ä¸ç”¨é…ç½®æ–ÒŽ³•
srvc.addUser(new User("4","æ·ÕdŠ çš„å¿U?,"æ·ÕdŠ çš„å¤‡æ³?));
//调用˜q”回List¾cÕdž‹å€¼çš„æ–ÒŽ³•,需è¦å®šä¹?List容器ä¸çš„å…ƒç´ ¾cÕdž‹ä¸ºUser
List userList = srvc.getUsersList();
Iterator userList_it = userList.iterator();
while (userList_it.hasNext()) {
User user = (User) userList_it.next();
System.out.print(user.toString());
}
}
}
5.¾l“æžœ:
Hello :msg1 : msg2
Id: 1 , name: semovy , remark: semovy's remark
Id: 2 , name: 韦善�, remark: 韦善茂的备注
Id: 3 , name: superman_wshm , remark: superman_wshm's remark
string1
å—符ä¸?
å—符ä¸?
string4
Id: 1 , name: semovy , remark: semovy's remark
Id: 2 , name: 韦善�, remark: 韦善茂的备注
Id: 3 , name: superman_wshm , remark: superman_wshm's remark
Id: 2 , name: 韦善�, remark: 韦善茂的备注
Id: 1 , name: semovy , remark: semovy's remark
Id: 2 , name: 韦善�, remark: 韦善茂的备注
Id: 3 , name: superman_wshm , remark: superman_wshm's remark
Id: 4 , name: æ·ÕdŠ çš„å¿U?, remark: æ·ÕdŠ çš„å¤‡æ³?br />
// Create your client
Client client = ....;
// Or get it from your proxy
Client client = ((XFireProxy) Proxy.getInvocationHandler(myClientProxy)).getClient();
client.setProperty(Channel.USERNAME, "username");
client.setProperty(Channel.PASSWORD, "pass");
åŽÕd¿˜äº†å†™æœåŠ¡ç«¯åº”è¯¥æ€Žä¹ˆåšï¼Œ˜q™ä¸ªusernameå’Œpassword该在那里验è¯å‘¢ï¼ŸåQŸæˆ‘¾˜»é了文档也没找ç€
æ¥çœ‹½W¬äºŒæ¡SOAP header authentication with JSR181åQŒçœ‹èµäh¥å€’是很简å?/p>
但是在Service的代ç 䏿¯ä¸ªæ–ÒŽ³•里都è¦å†™ä¸€ä¸ªUserToken验è¯çš„傿•ŽÍ¼Œè™½ç„¶ä¼ég¹Žæƒé™¾_’度能控制得很细åQŒä½†æ˜¯è¿™ä¸¥é‡æ±¡æŸ“了业务逻辑的代ç ,éžå¸¸çš„ä¸ä¼˜é›…åQŒæ”¾å¼ƒï¼
public void someOperation(String data, @WebParam(header=true) UserToken token) {
authenticate(token)
// do your normal request here
}
å†çœ‹WS-SecurityåQŒè¿™æ˜¯webserviceçš„å®‰å…¨æ ‡å‡†ï¼Œä½†å®žåœ¨å¤ªå¤æ‚了,òq¶ä¸”需è¦é…¾|®Service.xmlåQŒæˆ‘们项目是Java1.5åQŒService.xmlæ ÒŽœ¬ž®±æ²¡æœ‰å†™åQŒæ˜¯è‡ªåŠ¨ç”Ÿæˆçš„,我是实在找ä¸åˆ°Service.xml该在那酾|®ï¼Ÿåªå¥½ä½œçÅž
AuthenticationHandler需è¦ä¿®æ”¹ä¸€ä¸‹ï¼Œå…¶ä»–ä¸ç”¨å˜ï¼š
AuthenticationHandler.java
import org.apache.log4j.Logger;
import org.codehaus.xfire.MessageContext;
import org.codehaus.xfire.handler.AbstractHandler;
import org.codehaus.xfire.fault.*;
import org.jdom.*;
public class AuthenticationHandler extends AbstractHandler {
private static final Logger log = Logger.getLogger(AuthenticationHandler.class);
public void invoke(MessageContext context) throws Exception {
log.info("authentication handler is invoked");
if (context.getInMessage().getHeader() == null)
{
throw new XFireFault("Request must include company authentication token.",
XFireFault.SENDER);
}
Element header = context.getInMessage().getHeader();
Element token = header.getChild("AuthenticationToken");
if (token == null)
{
throw new XFireFault("Request must include authentication token.",
XFireFault.SENDER);
}
String username = token.getChild("Username").getText();
String password = token.getChild("Password").getText();
try {
// çŽ°åœ¨ä½ å·²¾lå¾—åˆîCº†å®¢æˆ·ç«¯ä¼ æ¥çš„usernameå’ŒpasswordåQŒé‚£ž®±éªŒè¯å®ƒå§ï¼ˆå¯ä»¥äº¤ç»™acegiæ¥éªŒè¯ï¼‰
}
}catch(Exception e) {
log.warn(e);
throw new XFireFault("Authentication Failed.",
XFireFault.SENDER);
}
}
}
客户端代ç :
SpringSideä¸å…³äºŽWebæœåŠ¡çš„é…¾|®æ˜¯åœ?/span>
WEB-IBF/classesæ–‡äšg下的applicationContext-webservice.xmlä¸é…¾|®çš„åQ?/span>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <import resource="classpath:org/codehaus/xfire/spring/xfire.xml"/> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <value>/BookService=bookService</value> </property> </bean> <bean id="baseWebService" class="org.codehaus.xfire.spring.remoting.XFireExporter" abstract="true"> <property name="serviceFactory" ref="xfire.serviceFactory"/> <property name="xfire" ref="xfire"/> </bean>
<bean id="bookService" parent="baseWebService"> <property name="serviceBean" ref="bookManager"/> <property name="serviceClass" value="org.springside.bookstore.service.webservice.BookService"/> </bean> </beans> |
½W¬ä¸€æ¥ï¼Œå¼•å…¥xfire.xmlæ–‡äšg
<import resource="classpath:org/codehaus/xfire/spring/xfire.xml"/>ã€‚è¿™æ øP¼Œæˆ‘们ž®×ƒ¸å¿…在web.xmlä¸é…¾|®äº†,˜q™ç§è¯æ³•在Springå‚考手册(2.0-M3åQ?.18èŠ‚ä¸æœ‰ä»‹¾l,3.19节介¾l了在web.xmlé…ç½®bean定义文äšg的方法,ž®±æ˜¯ä¸Šä¸€èŠ‚ä‹É用的æ–ÒŽ³•ã€?/span>
½W¬äºŒæ¥ï¼Œå¤„ç†æ˜ å°„åQŒå°†/BookService URLå’ŒbookService˜q™ä¸ªbeanè”ç³»èµäh¥ã€‚当ç„Óž¼Œ˜q™é‡ŒbookServiceåˆç‘ô承了baseWebServiceåQŒè¿™æ ·åšæŒºåéy妙,˜q™æ ·å¦‚果有多个WebæœåŠ¡beanåQŒå°±¾l§æ‰¿baseWebServicež®±å¯ä»¥äº†åQŒè¿™¿Ué¢å‘对象的概念˜q˜æ˜¯å€¼å¾—我们æå€¡çš„åQŒSpringå‚考手å†?.5节介¾l了相关的知识ã€?/span>
在bookService的定义ä¸åQŒserviceBean也就是接å£å®žçŽ°ç±»ä¸ºbookManager beanåQŒè¿™ä¸ªbean实际是在WEB-INF/classes/applicationContext-manager.xmlæ–‡äšg䏿‰€å®šä¹‰åQŒç±»å䨓org.springside.bookstore.service.logic.BookManageråQ?/span>
package org.springside.bookstore.service.logic; import … … public class BookManager extends BaseHibernateDao implements BookService { private CategoryManager categoryManager; public void setCategoryManager(CategoryManager categoryManager) { this.categoryManager = categoryManager; } protected Class getEntityClass() { … … } public Book get(Integer id) { … … } public void save(Book book) { … … } public void remove(Integer id) { … … } public List getAllCategorys() { … … } public Category getCategory(Integer id) { … … }
public List findBooksByName(String name) { … … }
public List getNewBooks() { … … }
public List findAllLowStock(Integer stockHint) { … … } public List findBooksByCategory(String category_id) { … … }
protected void filterCriteria(Criteria criteria, Map filter) { … … } } |
serviceClass也就是接å£ç±»ä¸?/span>
org.springside.bookstore.service.webservice.BookServiceåQ?/span>
package org.springside.bookstore.service.webservice; import java.util.List; public interface BookService { List findBooksByName(String name);
List findBooksByCategory(String category); List getAllCategorys(); } |
事实上,SpringSide既是一个WebæœåŠ¡çš„æä¾›è€…ï¼Œåˆæ˜¯ä¸€ä¸ªWebæœåŠ¡çš„æ¶ˆè´¹è€…ã€‚å®ƒåœ¨WEB-INF/classes/applicationContext-webservice-client.xmlæ–‡äšgä¸å®šä¹‰äº†æ¶ˆè´¹˜q™ä¸ªWebæœåŠ¡çš„beanåQ?/span>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <!-- 一分钟åˆäh–°ä¸€‹Æ¡sciprtæ–‡äšg--> <bean class="org.springframework.scripting.support.ScriptFactoryPostProcessor"> <property name="refreshCheckDelay" value="60" /> </bean> <bean id="BookServiceClient" class="org.springframework.scripting.groovy.GroovyScriptFactory"> <constructor-arg value="classpath:org/springside/bookstore/service/webservice/BookServiceClient.groovy"/> <property name="serviceUrl" value="http://localhost:8080/springside/service/BookService" /> </bean> </beans> |
˜q™ä¸ªæ¶ˆè´¹WebæœåŠ¡çš„bean定义为BookServiceClientåQŒå®ƒæ˜¯é‡‡ç”¨Groovy脚本è¯è¨€å®šä¹‰äº†ã€‚在Springå‚考手å†?2.0-M3)ä¸çš„½W?5ç« ä¸“é—¨ä»‹¾l在Springä¸è„šæœ¬è¯a€çš„ä‹É用,脚本è¯è¨€æ”¯æŒæ˜¯Spring 2.0新增的内å®?ç›®å‰å¯ä»¥æ”¯æŒGroovyã€BeanShellã€Jruby三ç§è„šæœ¬è¯è¨€ã€?/span>
˜q™ä¸ªBookServiceClient最¾lˆæ˜¯åœ¨dwrä¸ä‹É用,å¯ä»¥
plugins"org.springside.ajax.dwr"webapp"WEB-INF"dwr.xmlä¸çš„定义ã€?/span>
在SpringSide,采用Aegisçš„bindingæ–¹å¼åQŒåœ¨
plugins"org.springside.webservice.xfire"src"org"springside"bookstore"service"webservice"BookService.aegis.xmlä¸å®šä¹‰äº†˜q”回值的¾cÕdž‹åQ?/span>
<?xml version="1.0" encoding="UTF-8"?> <mappings> <mapping> <method name="findBooksByName"> <return-type componentType="org.springside.bookstore.domain.Book"/> </method> <method name="findBooksByCategory"> <return-type componentType="org.springside.bookstore.domain.Book"/> </method> <method name="getAllCategorys"> <return-type componentType="org.springside.bookstore.domain.Category"/> </method> </mapping> </mappings> |
XFire在SpringSideä¸çš„应用ž®×ƒ»‹¾l到˜q™é‡Œä¸ºæ¢ã€?/span>
当ä‹É用JDK1.4æ—Óž¼Œæˆ–者对JDK1.5çš„èŒƒåž‹å’Œæ³¨é‡Šä¸æ˜¯å¾ˆç†Ÿæ‚‰çš„æƒ…况下,当é‡åˆ°éœ€è¦æ˜ ž®„POJO或酾|®WebServiceæŽ¥å£æ–ÒŽ³•˜q”回¾cÕdž‹(如集åˆç±»åž?æ—Óž¼Œéœ€è¦è¿›è¡Œç»‘å®šï¼Œæ¤æ—¶aegisçš„ç»‘å®šäØ“å»ºç«‹.aegis.xml的文件ã€?/p>
1.当å°è£…的接壾cÖM¸åQŒæŸæ–ÒŽ³•˜q”回集刾cÕdž‹æ—Óž¼Œaegis的绑定方å¼ï¼š
例如åQŒéœ€è¦å°†ä»¥ä¸‹æŽ¥å£ž®è£…
代ç
è§‚å¯Ÿæ¤æŽ¥å£ï¼Œå—陿ˆ‘们看findRoleInfosByUserIDæ–ÒŽ³•åQŒæ¤æ–ÒŽ³•ä¼ å…¥String,˜q”回¾cÕdž‹ä¸ºCollectionåQŒæ¤æ—Óž¼Œæˆ‘们å³éœ€è¦é…¾|®findRoleInfosByUserIDæ–ÒŽ³•ã€?
é…ç½®æ¥éª¤åQŒåœ¨æŽ¥å£¾cÈš„åŒä¸€åŒ…下建立和接å£å相åŒçš„aegis.xmlæ–‡äšgåQŒå³UserInfo.aegis.xmlæ–‡äšgã€?
UserInfo.aegis.xml
代ç
å…¶ä¸åQŒmethod代表需è¦é…¾|®çš„æ–ÒŽ³•å,ç”׃ºŽXFireå¯ä»¥æ”¯æŒåŸºæœ¬¾cÕdž‹åQŒé’ˆå¯šw›†åˆç±»åž‹æ—¶åQŒéœ€è¦é…¾|®ï¼Œ˜q”回¾cÕdž‹æˆ–傿•°ç±»åž‹äؓ基本¾cÕdž‹æ—¶ä¸éœ€è¦ç‰¹ŒDŠé…¾|®ã€?
<return-type/>为酾|®è¿”回类型,componentType属性代表返回的集åˆä¸æ‰€åŒ…å«çš„ç±»åQŒæ¤¾cÕd¯ä»¥æ˜¯è‡ªå®šä¹‰çš„对象åQŒä¹Ÿå¯ä»¥æ˜¯åŸºæœ¬ç±»åž?例如java.lang.String
æ¤æ—¶åQŒfindRoleInfosByUserIDæ–ÒŽ³•é…置完毕
PSåQŒè¿˜æ‹¿æ¤æŽ¥å£ä¸¾ä¾‹åQŒå¦‚接å£ä¸ï¼ŒfindRoleInfosByUserID接å—çš„å‚æ•îC¹Ÿä¸ºé›†åˆç±»åž‹ï¼Œé‚£ä¹ˆéœ€è¦åœ¨<method></method>之间å†åР入以䏋代ç ?
代ç
index="0"代表æ–ÒŽ³•çš„å‚æ•°çš„åºå·åQ?å³ç¬¬ä¸€ä¸ªå‚æ•°ã€?
componentType代表集åˆå‚数内包å«çš„¾cÕdž‹åQŒä¹Ÿå¯ä»¥ä¸ø™‡ªå®šä¹‰å¯¹è±¡åQŒä¾‹å¦‚User
注æ„åQŒå¦‚æžœfindRoleInfosByUserIDæ–ÒŽ³•æœ‰ä¸¤ä¸ªå‚æ•ŽÍ¼Œä¸€ä¸ªæ¯”如䨓StringåQŒä¸€ä¸ªäؓ集åˆåQŒé‚£ä¹ˆåªéœ€è¦é…¾|®é›†åˆå‚æ•°å³å¯ã€?
äºŒã€‚æ˜ ž®„POJO
比如˜q˜æ˜¯ä¸Šé¢çš„UserInfo接å£åQŒç¬¬ä¸€ä¸ªæ–¹æ³?
public User findUserInfosByUserID(String userUniqueID);
æ¤æ—¶åQŒè¿”å›žç±»åž‹äØ“User
如果Userä¸ä»…为基本类型,例如StringåQŒint½{‰åŸºæœ¬ç±»åž‹ï¼Œæ— 需é…ç½®User
但如果Userä¸è¿˜åŒ…嫿œ‰å…¶ä»–ç±»åž‹ï¼Œæ¯”å¦‚åŒ…å«æœ‰SetåQŒListåQŒé‚£ä¹ˆéœ€è¦å¯¹å…¶è¿›è¡Œé…¾|?
比如User代ç 如下åQ?
代ç
æ¤æ—¶Userä¸è¿˜åŒ…嫿œ‰SDicSystemAuth的对象,以åŠSUserDepts½{‰Set集åˆ
˜q™ç§æƒ…况主è¦å¯èƒ½ä¼šå‡ºçŽ°åœ¨ä½¿ç”¨HibernateåQŒæ˜ ž®„一对一åQŒä¸€å¯¹å¤šè¡¨æ—¶
˜q™é‡Œè¦ç‰¹åˆ«æ³¨æ„?
é‚£ä¹ˆæ¤æ—¶æˆ‘们需è¦å¯¹User˜q›è¡Œaegis¾l‘定åQŒæŽ§åˆ¶POJOå’ŒXMLçš„æ˜ ž®?
é…ç½®æ–ÒŽ³•åQ?
在User对象所在包内å¾ç«‹User.aegis.xml
ç”׃ºŽUserä¸åŒ…å«SetåQŒé‚£ä¹ˆåªéœ€è¦å¯¹é›†åˆåšè®¾¾|®å³å¯ï¼ŒDicSystemAuth下é¢å•独讨论
我们å¯ä»¥åˆ†ä¸¤‹Æ¡æ¥é…ç½®åQŒåˆ†åˆ«è®²è§?
1,
代ç
æ¤æ—¶åQŒé…¾|®æ–‡ä»¶ä¸é…置了两个Set集åˆåQŒcomponentType明确定义了Set集åˆå†…包å«çš„内容
æ¤æ—¶åQŒDicSystemAuthå³ä¾¿æ˜¯è‡ªå®šä¹‰çš„对象类åQŒç”±äºŽä¸æ˜¯é›†åˆï¼ŒXFire也å¯ä»¥å¯¹å…¶æ£¼‹®æ˜ ž®„ã€?
2
代ç
½W¬äºŒ¿Uæ–¹å¼ï¼Œå®šä¹‰äº†ä¸‰ä¸ªå—ŒDµï¼Œòq¶ä‹É用了ignore属性,表示˜q™ä¸‰ä¸ªå±žæ€§ä¸èƒ½è¢«åºåˆ—化ã€?
那么åQŒä½•时会é‡åˆ°¾cÖM¼¼äºŽUserä¸Set集åˆåQŒä¸è¢«åºåˆ—化呢?
当客æˆïL«¯è®‰K—®æœ¬åœ°ä»£ç†æ—Óž¼Œå¦‚æžœUserè¡¨å†…åŒ…å«æœ‰å…¶ä»–è¡¨çš„å…³è”æ—¶åQŒå¦‚果基于hibernateçš„æŒä¹…层åQŒç”±äºŽhibernateçš„æƒ°æ€§åŠ è½½æœºåˆÓž¼ŒåŠ è²User时仅会将Userä¸çš„å±žæ€§å€¼åŠ è½½è€Œä¸ä¼šåŠ è½½å…³è”表ä¸çš„å€û|¼Œæ¯”如setå’ŒSDicSystemAuth对象½{‰ï¼Œå½“客æˆïL«¯è®‰K—®æœ¬åœ°ä»£ç†åQŒåºåˆ—化User对象æ—Óž¼Œå¦‚果没有讄¡½®å…Œ™”å—æ®µæ˜¯å¦åºåˆ—化,那么它会ž®†å…¶å…¨éƒ¨åºåˆ—化,但当åºåˆ—化时åQŒç”±äºŽhibernateçš„æƒ°æ€§åŠ è½½ï¼Œæ¤æ—¶Sessionå·²ç»å…³é—åQŒé‚£ä¹ˆåœ¨åºåˆ—化关è”å—ŒD늚„时候,ž®×ƒ¼šå‡ºçްsession was closeçš„å¼‚å¸¸ã€‚å› æ¤è§£å†›_Šžæ³•æ˜¯åœ¨aegis¾l‘定时制定关è”å—ŒD늚„ignore属性设¾|®äØ“trueã€?/p>
˜q˜æœ‰ä¸€¿U解军_Šžæ³•ï¼Œž®±æ˜¯ä»ç„¶æŒ‰ç…§½W¬ä¸€¿Ué…¾|®æ–¹å¼ï¼Œæ˜Žç¡®æŒ‡æ˜Žå…Œ™”çš„Set集åˆå†…的对象åQŒä½†åœ¨æ‰§è¡Œåºåˆ—化å‰ï¼Œsessionå…³é—之å‰åQŒæå‰å°†å…Œ™”å—æ®µå†…的值åˆå§‹åŒ–ã€?
用Hibernate.initializeåˆå§‹åŒ?/p>
最åŽè¡¥å……一ž®å¥
XFire对于自定义的对象å¯ä»¥èªæ˜Žçš„æ‰¾åˆŽÍ¼Œå‰ææ˜¯å®ƒä¸åŒ…å«é›†å?
ä¾‹å¦‚ä½ çš„æ–ÒŽ³•˜q”回一个User对象
Userä¸éƒ½æ˜¯åŸºæœ¬ç±»åž‹ï¼Œæˆ–者Userä¸åŒ…嫿œ‰Dept对象的引用,都没有问题ã€?
ä½†å¦‚æžœä½ ä¸å¸Œæœ›åŠ è½½useræ—¶åºåˆ—化Dept出问题,ž®×ƒ¹–乖把deptåˆå§‹åŒ–或ž®†deptçš„ignore属性设¾|®äØ“true