1

我正在尝试在现有的 spring 项目中配置一个建议。以下配置适用于单个包,但是当切入点表达式尝试将该建议应用于所有包时,它会给出以下错误。

我的配置:

<aop:config>
    <aop:pointcut id="loggingPointcut" expression="execution(* com.abc.businessprocess.operation..*.execute(..))" />
    <aop:advisor id="methodLoggingAdvisor" advice-ref="methodLoggingAdvice" pointcut-ref="loggingPointcut" />
</aop:config>

我也尝试了注释,但它给出了同样的错误。即使在使用它给出相同的错误之后,我也尝试使用 CGLIB。

错误:

Caused by: org.springframework.beans.TypeMismatchException: Failed to convert property value of type [$Proxy12 implementing com.fmr.ast.common.businessprocess.util.Timeable,com.fmr.ast.common.businessprocess.operation.Operation,com.fmr.commons.taskmanager.core.Task,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] to required type [com.fmr.ips.businessprocess.operation.goalsetup.GetLeveledIRGExpInc] for property 'getRawDetailedLeveledExpInc'; nested exception is java.lang.IllegalArgumentException: Cannot convert value of type [$Proxy12 implementing com.fmr.ast.common.businessprocess.util.Timeable,com.fmr.ast.common.businessprocess.operation.Operation,com.fmr.commons.taskmanager.core.Task,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] to required type [com.fmr.ips.businessprocess.operation.goalsetup.GetLeveledIRGExpInc] for property 'getRawDetailedLeveledExpInc': no matching editors or conversion strategy found
    at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:391)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.convertForProperty(AbstractAutowireCapableBeanFactory.java:1289)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1250)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1010)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:472)
    ... 33 more
Caused by: java.lang.IllegalArgumentException: Cannot convert value of type [$Proxy12 implementing com.fmr.ast.common.businessprocess.util.Timeable,com.fmr.ast.common.businessprocess.operation.Operation,com.fmr.commons.taskmanager.core.Task,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] to required type [com.fmr.ips.businessprocess.operation.goalsetup.GetLeveledIRGExpInc] for property 'getRawDetailedLeveledExpInc': no matching editors or conversion strategy found
    at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:231)
    at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:138)
    at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:386)
    ... 37 more
4

1 回答 1

5

查看异常跟踪这是我怀疑的:

GetLeveledIRGExpInc是实现三个接口的具体类:Timeable, Operation, Task. 您在上下文中声明了一个这种类型的 bean,由于您的 AOP 配置,它会被代理。这意味着bean的运行时类型将不再GetLeveledIRGExpInc$Proxy12(JDK代理),它仍然实现了上述三个接口,但不是具体类的子类型GetLeveledIRGExpInc

在您的上下文中某处还有另一个 bean 需要将这种类型的 bean 注入到名为getRawDetailedLeveledExpInc. 当 Spring 尝试将代理 bean 注入该属性时,它会失败,因为该属性的类型与 bean 的运行时类型不兼容。

根本问题是您尝试使用 JDK 代理机制应用非常通用的日志记录方面,该机制只能建议在接口上声明的方法。尝试使用<aop:config proxy-target-class="true">,以便也可以建议没有实现接口的类。这将解决上述详细问题,因为生成的 CGLIB 代理GetLeveledIRGExpInc实际上是它的子类型。(不要忘记将 cglib 添加到您的依赖项中以使其正常工作。)

于 2013-02-18T14:07:03.270 回答