读书人

SSH2添加事务代理出错折腾小弟我多时啊

发布时间: 2012-01-21 21:31:43 作者: rapoo

SSH2添加事务代理出错折腾我多时啊!
大体情况是这样的:
SSH2 添加事务代理后就出错,去掉事务代理后就不报错了 (启动服务器的时候)测试阶段,只有一个Action
希望各位不要觉得代码有点多并不吝指教 解决了 分数绝对不是问题 我另外加分?

下面是配置信息:
Spring配置:

XML code
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">    <!-- 数据源层 -->    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver">        </property>        <property name="url" value="jdbc:oracle:thin:@Jeelon:1521:fx"></property>        <property name="username" value="drp"></property>        <property name="password" value="drp"></property>    </bean>        <!-- SessionFactory层-->    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">        <property name="dataSource" ref="dataSource"></property>        <property name="configLocation" value="classpath:hibernate.cfg.xml">        </property>    </bean>        <!-- 事务管理层Biz-->    <bean id="tm" class="org.springframework.orm.hibernate3.HibernateTransactionManager">          <property name="sessionFactory" ref="sessionFactory" />     </bean>     <!-- 事务代理层 定义父类(为了使得多个Biz时不全部写以增加冗余 写出这个父类 下面的只需要几层次代理父类即可 把不同的目标类taret写出即可) -->    <bean id="BizProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true" lazy-init="true">        <property name="transactionManager" ref="tm"></property>        <property name="transactionAttributes">            <props>                <prop key="*">PROPAGATION_REQUIRED</prop>                <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>            </props>        </property>    </bean>             <!-- DAO层-->    <bean id="tUserDAO" class="com.jeelon.drp.dao.impl.TUserDAO">        <property name="sessionFactory">            <ref bean="sessionFactory" />        </property>    </bean>        <!-- BIZ层 -->    <bean id="tUserBiz" class="com.jeelon.drp.biz.impl.TUserBiz">        <property name="tUserDAO" ref="tUserDAO"></property>     </bean>    <!-- 继承上面的代理事务 -->    <bean id="moduleProxy" parent="BizProxy">        <property name="target" ref="tUserBiz"></property>    </bean>                <!-- Action层 -->    <bean id="UserAction" class="com.jeelon.drp.view.UserAction">        <property name="tUserBiz" ref="moduleProxy"></property>    </bean>    </beans>

struts配置:
XML code
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"><struts>    <!-- 将struts交给spring管理 -->    <constant name="struts.objectFactory" value="spring"></constant>    <package name="user" extends="struts-default">        <action name="login" class="UserAction">            <result name="success">main.jsp</result>            <result name="error">login.jsp</result>        </action>    </package></struts>     



下面是异常:



[解决办法]
<!-- BIZ层 -->
<bean id="tUserBiz" class="com.jeelon.drp.biz.impl.TUserBiz">
<property name="tUserDAO" ref="tUserDAO"></property>
</bean>
<!-- 继承上面的代理事务 -->
<bean id="moduleProxy" parent="BizProxy">
<property name="target" ref="tUserBiz"></property>
</bean>

<!-- Action层 -->
<bean id="UserAction" class="com.jeelon.drp.view.UserAction">
<property name="tUserBiz" ref="moduleProxy"></property>
</bean>

终于被我找到一个问题:
首先看你的错误提醒:
Failed to convert property value of type '$Proxy4 implementing com.jeelon.drp.biz.ITUserBiz,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised' to required type 'com.jeelon.drp.biz.impl.TUserBiz' for property 'tUserBiz'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [$Proxy4 implementing com.jeelon.drp.biz.ITUserBiz,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] to required type [com.jeelon.drp.biz.impl.TUserBiz] for property 'tUserBiz': no matching editors or conversion strategy found
at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:462)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.convertForProperty(AbstractAutowireCapableBeanFactory.java:1354)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1313)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1067)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:511)
... 43 more
Caused by: java.lang.IllegalStateException: Cannot convert value of type [$Proxy4 implementing com.jeelon.drp.biz.ITUserBiz,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] to required type [com.jeelon.drp.biz.impl.TUserBiz] for property 'tUserBiz': no matching editors or conversion strategy found

这个错误是指:你的tUserBiz在上面配置的是一个BIZ层【即我们平时习惯说的service层】的bean名称,而看看你下面
<!-- Action层 -->
<bean id="UserAction" class="com.jeelon.drp.view.UserAction">
<property name="tUserBiz" ref="moduleProxy"></property>
</bean>

这里为action配置biz层注入时,的属性名称又是tUserBiz,两处同名。
导致spring报错无法将com.jeelon.drp.biz.impl.TUserBiz这种类型转换为下面的属性所指的类型。。导致出错。。
把下面<property name="tUserBiz" ref="moduleProxy"></property>这个名称改一下,应该能正确。。。
[解决办法]
一群废物。

action里的Biz声明是必须是接口类,配置文件里指向实现类

因为你用的动态代理方法,只能这么配。
[解决办法]
动态代理两种 如果该类有实现接口那么就自动用jdk的动态代理 如果没有实现的话 spring会自动去用cglib来进行实现的
[解决办法]
好像是你action中的tUserBiz是实现类而不是接口啊。 然后注入时代理类不能转换成目标。
action中应该用接口吧。 要不然用cglib代理。

读书人网 >J2EE开发

热点推荐