zoukankan      html  css  js  c++  java
  • 【spring】IllegalArgumentException Can not set field to $Proxy 在spring中使用事物或AOP遇到的错误

    今天在spring中使用事务时,遇到了这个问题,已启动tomcat就出错:

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'diseasesQueryControl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.ccnt.med.abservice.QueryService org.ccnt.med.control.DiseasesQueryControl.queryService; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'queryServiceImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.ccnt.med.dao.TbDiseaseDao org.ccnt.med.servimpl.QueryServiceImpl.tbDiseaseDao; nested exception is java.lang.IllegalArgumentException: Can not set org.ccnt.med.dao.TbDiseaseDao field org.ccnt.med.servimpl.QueryServiceImpl.tbDiseaseDao to $Proxy9
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:285)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1074)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:580)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)
        at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:276)
        at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:197)
        at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47)
        at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4791)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5285)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
        at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
        at java.util.concurrent.FutureTask.run(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)

    解决方法:

    http://forum.springsource.org/showthread.php?85016-IllegalArgumentException-with-ApplicationContextAware-Proxy

    在配置文件中加入proxy-target-class="true"

    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>

    或者:

    <aop:config proxy-target-class="true">

    现在我的配置文件如下:

    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
        <!-- 配置事务管理器 -->
        <bean
            id="transactionManager"
            class="org.springframework.orm.hibernate3.HibernateTransactionManager" >
            <property name="sessionFactory" >
                <ref local="sessionFactory" />
            </property>
        </bean>
        <!-- 配置哪些方法需要哪些事务 -->
        <tx:advice
            id="txadvice"
            transaction-manager="transactionManager" >
            <tx:attributes>
                <tx:method
                    name="create*"
                    propagation="REQUIRED" />
                <tx:method
                    name="delete*"
                    propagation="REQUIRED" />
                <tx:method
                    name="update*"
                    propagation="REQUIRED" />
                <tx:method name="read*"
                    read-only="true"
                    propagation="NOT_SUPPORTED"/>
                <tx:method
                    name="*"
                    read-only="true" />
            </tx:attributes>
        </tx:advice>
        <!-- pointcut切入点;advice,通知,即被织入的方法 。这儿是AOP-->
        <aop:config proxy-target-class="true">
            <aop:pointcut
                id="managerMethods"
                expression="execution (* org.ccnt.med.dao.TbTopicDao.*(..))" />
            <aop:pointcut
                id="managerMethods"
                expression="execution (* org.ccnt.med.dao.TbDisTopicDao.*(..))" />
            <aop:advisor
                advice-ref="txadvice"
                pointcut-ref="managerMethods" />
        </aop:config>

    解释:

    AOP使用的动态代理可以针对接口,也可以针对类。java的动态代理只能针对接口。

    在用Spring的AOP时,默认动态代理是针对接口的,而我用的是针对类的,所以要加上proxy-target-class="true"

  • 相关阅读:
    201671030116宋菲菲 实验三作业互评与改进报告
    通读《构建之法》提出问题
    201671010460-朱艺璇-实验四附加实验
    201671010460朱艺璇 词频统计软件项目报告
    201671010460朱艺璇 实验三作业互评与改进报告
    阅读《现代软件工程—构建之法》提出的问题
    手把手带你了解消息中间件(3)——RocketMQ
    字符编码的历史由来
    linux常用命令
    linux各目录及重要目录的详细介绍
  • 原文地址:https://www.cnblogs.com/549294286/p/3019074.html
Copyright © 2011-2022 走看看