Hibernate + Spring + Struts中的一个常见错误

原创 2007年10月06日 09:36:00
        使用Spring中的AOP技术代理了Service(实现声明式事务管理),然后将Service通过IoC注入给Action.未加入Struts时一切正常,但是加入Struts后出错,提示信息大意为无法将被代理的Service对象注入给Action,异常为ClassCastException.

    【分析原因】

    ClassCastException表明这是一个类型不匹配错误,再看详细的出错信息:"Can't convert $Proxy1 to com.xaccp.XxxService"(大体是这个意思,原文记不清了),说明在Action中需要的类型为com.xaccp.XxxService,而实际传入的是$Proxy1。

    接下来应该想到Service对象是被Spring代理的,Spring中有两种实现代理的方法:JDK提供的动态代理CGLIB

    CGLIB的实现原理是动态生成目标类(Target)的子类,如果一个类采用CGLIB代理的,生成的子类类名一般为com.xaccp.XxxService$$EnhanceByCGLIB$xxxx的格式,并且根据父子类转换的规则,在要求目标类的地方,如果传入生成的代理类不会发生ClassCastException异常。

    而动态代理的实现原理是动态生成一个与目标类显示相同接口的类,生成类类名就是$Proxy1这样的格式,在要求目标类的地方,如果传入生成的代理类就会发生上面的错误。

    再看学生写的Service类,果然实现了一个接口,那么默认的情况下,如果类存在接口,Spring就会采用动态代理来实现AOP,于是发生了上面的错误。

【解决方案】

    分析清楚原因以后解决方案就出来了:

    最简单的一种方案就是去掉Service实现的接口,那么Spring会采用CGLIB来实现AOP。但是这个方案显然破坏了代码的结构

    最应该采取的一种方案是在Action中不要直接将属性声明为Service类,而是声明为其接口,这样Spring就可以将实现了同样接口的$Proxy1代理类注入进来。并且体现了面向接口编程的原则。

    还有一种方案就是在设置代理时指明proxyTargetClass属性为true,强制Spring采用CGLIB进行代理,如下所示:

<bean id="service" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
 <property name="target">
  <ref bean="dummyService"/>
 </property>
  <property name="proxyTargetClass">
   <value>true</value>
  </property>
 <property name="transactionManager">
  <ref bean="tm"/>
 </property>
 <property name="transactionAttributes">
  <props> 
   <prop key="*">PROPAGATION_REQUIRED</prop>
  </props>
 </property>
</bean>

 

java中三大框架struts/Hibernate/Spring,具体是怎样合作工作的?各自实现什么功能?

java中三大框架struts/Hibernate/Spring,具体是怎样合作工作的?各自实现什么功能? 随着Java技术的逐渐成熟与完善,作为建立企业级应用的标准平台,J2EE平台得到了长足的发...
  • Jos_lin
  • Jos_lin
  • 2013年12月28日 15:08
  • 2247

【SSH网上商城项目实战01】整合Struts2、Hibernate4.3和Spring4.2

今天开始做一个网上商城的项目,首先从搭建环境开始,一步步整合S2SH。这篇博文总结了如何整合Struts2、Hibernate4.3和Spring4.2。 整合三大框架得先从搭建各部分环境开始,也就是...
  • eson_15
  • eson_15
  • 2016年05月04日 22:11
  • 44182

Spring种常见异常解决方法

一、找不到配置文件的异常 [plain] view plaincopy org.springframework.beans.factory.BeanDe...
  • scholar_man
  • scholar_man
  • 2015年09月23日 16:56
  • 1353

使用Spring、Hibernate、Struts的一些错误总结.mht

  • 2012年01月09日 10:00
  • 437KB
  • 下载

springMvc+Spring4+hibernate4整合常见错误

最近一直在做springMvc+Spring4+hibernate4的整合,出了不少错误,这都是我们宝贵的经验啊,在整合的过程中,最大的问题就是版本升级的问题,之前做过jdk1.6的例子,很顺利,但是...
  • xvshu
  • xvshu
  • 2015年01月05日 23:33
  • 7527

Struts2+hibernate+spring的常见面试题

  • 2015年10月08日 20:58
  • 403KB
  • 下载

使用Spring、Hibernate、Struts的一些错误总结(不断补充)

1.      错误: java.lang.NullPointerException  原因: 发现 dao 实例、 manage 实例等需要注入的东西没有被注入  解决:这个时候...
  • zxcvzxcv7
  • zxcvzxcv7
  • 2012年03月24日 14:39
  • 311

spring、Struts2、hibernate常见面试题

  • 2017年07月30日 13:59
  • 150KB
  • 下载

Spring,hibernate,struts常见的面试笔试题汇总

  • 2009年12月13日 14:29
  • 55KB
  • 下载

Jbpm4.4+hibernate3.5.4+spring3.0.4+struts2.1.8整合例子(附完整的请假流程例子,jbpm基础,常见问题解决)

Jbpm4.4+hibernate3.5.4+spring3.0.4+struts2.1.8整合例子(附完整的请假流程例子)。1.       jbpm4.4测试环境搭建2.       Jbpm...
  • centre10
  • centre10
  • 2011年04月25日 11:25
  • 16848
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章: Hibernate + Spring + Struts中的一个常见错误
举报原因:
原因补充:

(最多只允许输入30个字)