Язык выражения Spring не работает с Spring AOP - PullRequest
4 голосов
/ 28 августа 2010
<bean id="eddie" class="com.springinaction.Instrumentalist">
    <property name="instrument" value="#{violin}"></property>
    <property name="song" value="#{kenny.song}"></property>

</bean>

<bean id="violin" class="com.springinaction.Violin">
</bean>


<bean id="kenny" class="com.springinaction.Instrumentalist">
    <property name="song" value="Kenny is a star,kenny is a star"></property>
    <property name="instrument" ref="saxopone"></property>
</bean>

<aop:config>

    <aop:aspect ref="audience">

        <aop:before pointcut="execution(* com.springinaction.Performer.perform(..))" method="takeSeats()"/>

        <aop:after-throwing method="demandRefund" pointcut="execution(* com.springinaction.Performer.perform(..))"/>

    </aop:aspect>

</aop:config>

В приведенном выше коде я внедряю свойство song, instrument компонента eddie, используя язык выражения Spring. Но свойство song введено неправильно ... и я получаю сообщение об ошибке ниже:

Исключение в теме "главная" org.springframework.beans.factory.BeanCreationException: Ошибка создания бина с именем 'eddie' определено в ресурсе пути к классу [spring-config.xml]: инициализация боб не удался; вложенное исключение org.springframework.beans.factory.BeanExpressionException: Не удалось разобрать выражение; вложенными исключение org.springframework.expression.spel.SpelEvaluationException: EL1008E: (поз. 6): поле или свойство «песня» не может быть найдена на объекте введите "$ Proxy4" в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:519) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:450) в org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject (AbstractBeanFactory.java:290) в org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:222) в org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:287) в org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:189) в org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons (DefaultListableBeanFactory.java:557) в org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization (AbstractApplicationContext.java:842) в org.springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java:416) в org.springframework.context.support.ClassPathXmlApplicationContext. (ClassPathXmlApplicationContext.java:139) в org.springframework.context.support.ClassPathXmlApplicationContext. (ClassPathXmlApplicationContext.java:83) в com.springinaction.Main.main (Main.java:10)

Свойство инструмента вводится правильно, когда свойство песни не вводится, и это происходит только из-за aop.

когда я комментирую <aop:config> все работает нормально ..

Что-то не так?

1 Ответ

4 голосов
/ 28 августа 2010

Вы пробовали

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

Таким образом, вы получаете динамический подкласс, и свойство должно быть доступно в прокси, созданном с помощью Spring AOP.

Поведение Spring AOP по умолчанию заключается в создании прокси Java для интерфейсов, поэтому свойства любых классов не будут доступны через прокси.

...