2013-02-18 2 views
1

Я пытаюсь настроить один совет в существующем проекте весны. Следующая конфигурация работает отлично для одного пакета, но когда выражение pointcut пытается применить эту рекомендацию ко всем пакетам, она дает следующую ошибку.

Моя конфигурация:

<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 

ответ

5

Глядя за исключением проследить это то, что я подозреваю:

GetLeveledIRGExpInc является конкретный класс, который реализует три интерфейса: Timeable, Operation, Task. У вас есть бит этого типа, объявленный в вашем контексте, который проксируется из-за вашей конфигурации AOP. Это означает, что тип времени выполнения компонента не будет GetLeveledIRGExpInc, это будет $Proxy12 (прокси JDK), который все еще реализует вышеупомянутые три интерфейса, но не является подтипом конкретного класса GetLeveledIRGExpInc.

Существует еще один bean-компонент в вашем контексте, который нуждается в компоненте этого типа для инъекции в свойство с именем getRawDetailedLeveledExpInc. Когда Spring пытается внедрить прокси-сервер в это свойство, он терпит неудачу, потому что тип свойства несовместим со типом среды bean.

Основная проблема заключается в том, что вы пытаетесь применить очень общий аспект ведения журнала с использованием механизма проксирования JDK, который может только конкретизировать методы, объявленные на интерфейсах. Попробуйте использовать <aop:config proxy-target-class="true">, чтобы можно было посоветовать классы без реализованных интерфейсов. Это позволило бы устранить описанную выше проблему, поскольку созданный прокси CGLIB для GetLeveledIRGExpInc фактически будет подтипом. (Не забудьте добавить cglib в ваши зависимости, чтобы это работало.)

+0

Большое спасибо Zagyi за прекрасное объяснение. Как я уже упоминал в своем посте, я пробовал это с CGLIB, используя и попытался ввести ложное значение для этого, но получал такую ​​же ошибку. Любая другая возможная причина? – Rohit

+0

Вы не могли получить ту же ошибку, если усилитель CGLIB использовался для проксирования. Прокси, созданный CGLIB, выглядит примерно так: 'GetLeveledIRGExpInc $$ EnhancerByCGLIB $$ '. В вашем стеке ясно видно, что прокси-серверы JDK ('$ Proxy12') находятся на своем месте, поэтому должна быть какая-то проблема с вашей конфигурацией AOP. – zagyi

+0

Спасибо большое Zagyi, Как вы сказали, я попробовал еще раз с CGLIB и его работой сейчас. Я добавил конструктор по умолчанию во все операции и исправил свою проблему. – Rohit