axis2 soap整合hibernate遇到的classloader问题【zz】

问题:aar 无法提供classpath的环境
尽管aar环境非常象WEB-INF/class, 但aar不提供classpath的环境
服务代码:
package com.machome.test;
import com.machome.model.Student2;

public class TestHibernate {
    public static void main(String[] args) {
        System.out.println(findById(3));
    }

    public static String findById(int id) {
        Configuration cfg = new Configuration();
        SessionFactory sf =null;
        Session session = null;       
        Transaction tran = null;
        try {
            sf =cfg.configure().buildSessionFactory();
            session = sf.openSession();          
            tran = session.beginTransaction();          
            Student2 stu = (Student2)session.get(Student2.class, id);         
            return stu.getName();          
        } catch (HibernateException e) {
            e.printStackTrace();
            return null;
        }finally{
            tran.commit();
            session.close();
            sf.close();
        }   
    }
   
}
我们执行的ant target如下: 生成aar文件,形成类似WEB-INF/classes的目录结构
    <target name="generate.service" depends="compile.service">
        <!--copy services.xml -->
        <copy toDir="${service.target}/classes" fail>
            <fileset dir="${basedir}/resources">
                <include name="**Test.class" dir="${service.target}/classes"/>
        </jar>
    </target>
形成的TestHibernate.aar包结构如下:
TestHibernate.aar
    |----com
         |--machome
               |--model
                    |-- Student2.class
                    |-- Student2.hbm.xml
               |--test
                    |-- TestHibernate.class
    |---META-INF
         |--MANIFEST.MF
         |--services.xml
    |---hibernate.cfg.xml  
而实际部署到axis2项目的后果:   
  • hibernate.cfg.xml放在aar内,axis2项目报错找不到
  • service 类 调用其他实体类(Student2),但实体类放在aar中没用,axis2项目报错找不到
  • hibernate如果采用hbm mapping文件(Student2.hbm.xml),则hbm mapping放在aar中没用,axis2项目报错找不到


解决法1: 按普通项目部署,将需要的配置文件,类文件,库部署到axis2项目的buildpath(比如:WEB-INF/classes和lib
--src----
      |--com.machome.model
           |--Student2.java
           |--Student2.hbm.xml
      |--hibernate.cfg.xml    
--webroot--
      |--WEB-INF
           |-classes
                |--com.machome.model
                      |-- Student2.class
                      |-- Student2.hbm.xml
                |--hibernate.cfg.xml
           |-lib
               |-- jar file
           |-conf
           |-modules
           |-services
               |-TestHibernate.aar
这是最常见的解决办法, 目前google和百度上能搜索到的都是这个解决办法.
其实这个解决办法也是最合理的,多数人甚至并没有通过网上搜索解决,完全自己就能想出来,毕竟支持文件和库找不到,肯定是build path 和classpath出问题,而众所周知的build path其实就两种:1.classpath环境变量指定 2.web container 的WEB-INF/classes和lib


问题的原因和原理:
AXIS2 没对每个service 设置专门的classloader, 而是实现一个统一的classloader, 由这个classloader管理所有的service
这个统一的classloader实现了一些特殊的功能,比如service间的隔离,避免部署多个service时有可能出现的同名类和库的冲突
知道了原理,就可以推导出解决办法: 为每个service 设置单独的classloader,(实际是为每个service的每个线程设置单独的classloader--Thread Context Class Loader(TCCL))

              
解决法2: 很简单,在services.xml加下面一句
 <parameter name="ServiceTCCL">composite</parameter>
 例子:
<service name="TestHibernate" scope="application" targetNamespace="http://quickstart.samples/">
    <description>
        TestHibernate Service
    </description>
    <messageReceivers>
        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
                         class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
                         class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
    </messageReceivers>
    <schema schemaNamespace="http://quickstart.samples/xsd"/>
    <parameter name="ServiceClass">com.machome.test.TestHibernate</parameter>
   
    <parameter name="ServiceTCCL">composite</parameter>
   
</service>
部署:
--src----
   
--webroot--
      |--WEB-INF
           |-classes

           |-lib

           |-conf
           |-modules
           |-services
               |-TestHibernate.aar
               |-TestHibernateAnon.aar
               |-Student.aar
                 同时部署多个相互之间没有关系的服务
测试:
http://localhost:8080/axis2/services/TestHibernate/findById?id=2
结果:
<ns:findByIdResponse>
<ns:return>mac</ns:return>
</ns:findByIdResponse>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值