Hi
I'm having problem with @Value annotation and SpringEL when trying to set value of an inner bean property.
As you can see below my application context contains declaration of two beans:
- topLevelBean
- holder bean
As you can see SampleBean has annotated property called "property" which is set fine when used from top level bean but when I try to use this class as inner bean I'm getting an exception.
I think that this problem could be solved by applying patch below.
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:util="http://www.springframework.org/schema/util" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd" > <context:annotation-config/> <util:properties id="settings"> <prop key="someProperty">bla bla</prop> </util:properties> <bean class="test.SampleBean" id="topLevelBean" /> <bean class="test.SampleBeanHolder" id="holder"> <property name="sampleBean"> <!-- this inner bean causes an exception --> <bean class="test.SampleBean" /> </property> </bean> </beans>Code:package test; public class SampleBeanHolder { private SampleBean sampleBean; public void setSampleBean(SampleBean sampleBean) { this.sampleBean = sampleBean; } public SampleBean getSampleBean() { return sampleBean; } }Code:package test; import org.springframework.beans.factory.annotation.Value; public class SampleBean { @Value("#{settings.someProperty}") private String property; public String getProperty() { return property; } }Code:Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'holder' defined in file [E:\bedkowsk\projects\migrations\migration_tools\TariffMig\tmp\bla.xml]: Cannot create inner bean 'test.SampleBean#1f26605' of type [test.SampleBean] while setting bean property 'sampleBean'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'test.SampleBean#1f26605': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private java.lang.String test.SampleBean.property; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'test.SampleBean#1f26605' is defined at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:281) at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:120) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1305) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1067) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:511) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:289) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:286) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:188) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:558) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:852) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:422) at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:140) at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:84) at Bla.main(Bla.java:7) Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'test.SampleBean#1f26605': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private java.lang.String test.SampleBean.property; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'test.SampleBean#1f26605' is defined at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:283) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1055) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:511) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450) at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:270) ... 15 more Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private java.lang.String test.SampleBean.property; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'test.SampleBean#1f26605' is defined at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:500) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:84) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:280) ... 19 more Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'test.SampleBean#1f26605' is defined at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:505) at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1040) at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedBeanDefinition(AbstractBeanFactory.java:826) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:692) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:681) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.resolvedCachedArgument(AutowiredAnnotationBeanPostProcessor.java:429) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.access$0(AutowiredAnnotationBeanPostProcessor.java:425) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:462) ... 21 moreCode:diff spring-framework-3.0.0.RC2/src/org/springframework/beans/factory/support/AbstractBeanFactory.java workspace/spring/src/org/springframework/beans/factory/support/AbstractBeanFactory.java 1257c1257,1262 < Scope scope = getRegisteredScope(beanDefinition.getScope()); --- > Scope scope; > if( beanDefinition != null ) { > scope = getRegisteredScope(beanDefinition.getScope()); > } else { > scope = getRegisteredScope(SCOPE_PROTOTYPE); > } diff spring-framework-3.0.0.RC2/src/org/springframework/beans/factory/support/DefaultListableBeanFactory.java workspace/spring/src/org/springframework/beans/factory/support/DefaultListableBeanFactory.java 692c692,696 < value = evaluateBeanDefinitionString(strVal, getMergedBeanDefinition(beanName)); --- > try { > value = evaluateBeanDefinitionString(strVal, getMergedBeanDefinition(beanName)); > } catch( NoSuchBeanDefinitionException e ) { // this means it's an inner bean > value = evaluateBeanDefinitionString(strVal, null ); > }


Reply With Quote