xfire aegis 映射(转)友好参数名

新一篇: XFire传入传出自定义类型和集合类型学习笔记
 
首先说明,aegis为XFire默认的绑定方式,何时需要绑定?  
当使用JDK1.4时,或者对JDK1.5的范型和注释不是很熟悉的情况下,当遇到需要映射POJO或配置WebService接口方法返回类型(如集合类型)时,需要进行绑定,此时aegis的绑定为建立.aegis.xml的文件。

1.当封装的接口类中,某方法返回集合类型时,aegis的绑定方式:  
例如,需要将以下接口封装  


代码
public interface UserInfo {   
   
  public User findUserInfosByUserID(String userUniqueID);   
  public String test();   
  public Collection findRoleInfosByUserID(String userUniqueID);   
  }   
   


观察此接口,受限我们看findRoleInfosByUserID方法,此方法传入String,返回类型为Collection,此时,我们即需要配置findRoleInfosByUserID方法。  
配置步骤,在接口类的同一包下建立和接口名相同的aegis.xml文件,即UserInfo.aegis.xml文件。  
UserInfo.aegis.xml  

代码
<?xml version="1.0" encoding="UTF-8"?>   
<mappings>   
  <mapping>   
  <method name="findRoleInfosByUserID">   
  <return-type   
  componentType="com.tongtech.bjvsp.sysmng.entity.Role" />   
  </method>   
  </mapping>   
</mappings>   
   


其中,method代表需要配置的方法名,由于XFire可以支持基本类型,针对集合类型时,需要配置,返回类型或参数类型为基本类型时不需要特殊配置。  
<return-type/>为配置返回类型,componentType属性代表返回的集合中所包含的类,此类可以是自定义的对象,也可以是基本类型,例如java.lang.String  
此时,findRoleInfosByUserID方法配置完毕

PS,还拿此接口举例,如接口中,findRoleInfosByUserID接受的参数也为集合类型,那么需要在<method></method>之间再加入以下代码  


代码
<parameter index="0" componentType="java.lang.String"/>   


index="0"代表方法的参数的序号,0即第一个参数。  
componentType代表集合参数内包含的类型,也可以为自定义对象,例如User  
注意,如果findRoleInfosByUserID方法有两个参数,一个比如为String,一个为集合,那么只需要配置集合参数即可。

二。映射POJO  
比如还是上面的UserInfo接口,第一个方法  
public User findUserInfosByUserID(String userUniqueID);  
此时,返回类型为User  
如果User中仅为基本类型,例如String,int等基本类型,无需配置User

但如果User中还包含有其他类型,比如包含有Set,List,那么需要对其进行配置  
比如User代码如下:  


代码
public class User implements java.io.Serializable {   
   
  // Fields   
   
  private Integer userId;   
  private String loginName;   
  private String userPassword;   
  private Integer SOrder;   
  private String userCa;   
  private String userName;   
  private String userTel;   
  private String userEmail;   
  private String ZNote;   
  private String userCode;   
  private DicSystemAuth SDicSystemAuth;   
  private Set SGroupUsers = new HashSet(0);   
  private Set SUserDepts = new HashSet(0);   
}   


此时User中还包含有SDicSystemAuth的对象,以及SUserDepts等Set集合  
这种情况主要可能会出现在使用Hibernate,映射一对一,一对多表时  
这里要特别注意  
那么此时我们需要对User进行aegis绑定,控制POJO和XML的映射  
配置方法:  
在User对象所在包内建立User.aegis.xml  
由于User中包含Set,那么只需要对集合做设置即可,DicSystemAuth下面单独讨论

我们可以分两次来配置,分别讲解  
1,  


代码
<?xml version="1.0" encoding="UTF-8"?>   
<mappings xmlns:my="http://my.bjvsp.tongtech.com">   
<mapping name="my:User">   
<property name="SGroupUsers" componentType="com.tongtech.bjvsp.sysmng.entity.GroupUser"/>   
<property name="SUserDepts" componentType="com.tongtech.bjvsp.sysmng.entity.UserDept"/>   
</mapping>   
</mappings>   


此时,配置文件中配置了两个Set集合,componentType明确定义了Set集合内包含的内容  
此时,DicSystemAuth即便是自定义的对象类,由于不是集合,XFire也可以对其正确映射。

2  


代码
<?xml version="1.0" encoding="UTF-8"?>   
<mappings xmlns:my="http://my.bjvsp.tongtech.com">   
<mapping name="my:User">   
   
<property name="SGroupUsers" ignore="true"/>   
<property name="SUserDepts" ignore="true"/>   
<property name="SDicSystemAuth" ignore="true"/>   
</mapping>   
</mappings>   


第二种方式,定义了三个字段,并使用了ignore属性,表示这三个属性不能被序列化。  
那么,何时会遇到类似于User中Set集合,不被序列化呢?

当客户端访问本地代理时,如果User表内包含有其他表的关联时,如果基于hibernate的持久层,由于hibernate的惰性加载机制,加载User时仅会将User中的属性值加载而不会加载关联表中的值,比如set和SDicSystemAuth对象等,当客户端访问本地代理,序列化User对象时,如果没有设置关联字段是否序列化,那么它会将其全部序列化,但当序列化时,由于hibernate的惰性加载,此时Session已经关闭,那么在序列化关联字段的时候,就会出现session was close的异常。因此解决办法是在aegis绑定时制定关联字段的ignore属性设置为true。

还有一种解决办法,就是仍然按照第一种配置方式,明确指明关联的Set集合内的对象,但在执行序列化前,session关闭之前,提前将关联字段内的值初始化。  
用Hibernate.initialize初始化

最后补充一小句  
XFire对于自定义的对象可以聪明的找到,前提是它不包含集合  
例如你的方法返回一个User对象  
User中都是基本类型,或者User中包含有Dept对象的引用,都没有问题。  

但如果你不希望加载user时序列化Dept出问题,就乖乖把dept初始化或将dept的ignore属性设置为true 

 

一、WebServices接口的描述文件WSDL中经常出现name="in0"如下:

<xsd:element maxOccurs="1" minOccurs="1" name="in0" nillable="true" type="xsd:string" />
<xsd:element maxOccurs="1" minOccurs="1" name="in1" nillable="true" type="xsd:string" />
<xsd:element maxOccurs="1" minOccurs="1" name="in2" nillable="true" type="xsd:string" />

     这样对于客户端来说太不方便了需要对着接口文档才知道每个参数的名字。如何让这些不友好的名称改成友好的参数名name="destnum"呢?以下2种方法可以实现。

二、XML配置文件

在接口类同一包下面建一个接口类名称.aegis.xml 的文件,内容如下 
<?xml version="1.0" encoding="UTF-8"?>   
<mappings>   
    <mapping>   
       <method name="receive">   
           <parameter index="0" mappedName="destnum" /> 
           <parameter index="1" mappedName="srcnum" /> 
           <parameter index="2" mappedName="msg" />

           <parameter index="3" mappedName="msgtype" /> 
       </method> 
   </mapping>   
</mappings>

                 name为接口中方法名称 
                index为方法中第一个参数 
                 mappedName为替换后的名称
 

三、JSR181注解配置(也称:annotation方式)

      @WebService
public interface SMSstaterepReceive {
  
    @WebMethod
    @WebResult(name="result") //返回值的name
    public String receive(@WebParam(name="destnum")String destnum,@WebParam(name="srcnum")String srcnum,@WebParam(name="msg")String msg,@WebParam(name="msgtype")int msgtype);//接收接口;@WebParam 参数name
}

       services.xml配置文件配置接口

      <service>
    <!-- 接收上家短信平台的状态报告、上行信息接口 -->
    <name>SMSreceiveService</name>
    <namespace>http://scommnet.com/service/SMSreceiveService</namespace>
    <serviceClass>com.scommnet.sms.extend.scommnet.webservices.service.SMSstaterepReceive</serviceClass>
    <implementationClass>com.scommnet.sms.extend.scommnet.webservices.service.impl.SMSstaterepReceiveImpl</implementationClass>
    <serviceFactory>jsr181</serviceFactory> <!--这个必须配置,要不还是显示in0-->

四、效果

    <xsd:complexType>

- <xsd:sequence>
<xsd:element maxOccurs="1" minOccurs="1" name="destnum" nillable="true" type="xsd:string" />
<xsd:element maxOccurs="1" minOccurs="1" name="srcnum" nillable="true" type="xsd:string" />
<xsd:element maxOccurs="1" minOccurs="1" name="msg" nillable="true" type="xsd:string" />
<xsd:element maxOccurs="1" minOccurs="1" name="msgtype" type="xsd:int" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
- <xsd:element name="receiveResponse">
- <xsd:complexType>
- <xsd:sequence>
<xsd:element maxOccurs="1" minOccurs="1" name="result" nillable="true" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
 

posted on 2012-03-22 10:15  小山丘  阅读(1755)  评论(0编辑  收藏  举报

导航