Results 1 to 5 of 5

Thread: Bug in BeanFactoryPostProcessor processing

  1. #1
    Join Date
    Aug 2004
    Location
    Vrhnika, Slovenia
    Posts
    133

    Default Bug in BeanFactoryPostProcessor processing

    I get an exception when trying to initialize this context:
    Code:
        <!-- ========================= GENERAL DEFINITIONS ========================= -->
    
        <!-- Configurer that replaces $&#123;...&#125; placeholders with values from a properties file -->
        <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            <property name="order"><value>1</value></property>
            <property name="location"><value>/WEB-INF/ecos.properties</value></property>
        </bean>
    
        <!-- Message source for this context, loaded from localized "messages_xx" files -->
        <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
            <property name="basename"><value>WEB-INF/messages</value></property>
            <property name="defaultEncoding"><value>Windows-1250</value></property>
        </bean>
    
        <!-- ========================= RESOURCE DEFINITIONS ========================= -->
    
        <!-- Local DataSource that works in any environment -->
        <bean id="dataSourceImpl" class="com.generalynx.ecos.db.datasource.InfoBasicDataSource" destroy-method="close">
            <property name="driverClassName"><value>$&#123;jdbc.driverClassName&#125;</value></property>
            <property name="url"><value>$&#123;jdbc.url&#125;</value></property>
            <property name="username"><value>$&#123;jdbc.username&#125;</value></property>
            <property name="password"><value>$&#123;jdbc.password&#125;</value></property>
            <property name="validationQuery"><value>$&#123;jdbc.validationQuery&#125;</value></property>
        </bean>
    
        <bean id="dataSource" class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
            <constructor-arg><ref local="dataSourceImpl"/></constructor-arg>
        </bean>
    
        <!-- Hibernate SessionFactory -->
        <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" depends-on="resources">
            <property name="useTransactionAwareDataSource"><value>false</value></property>
            <property name="dataSource"><ref local="dataSource"/></property>
            <property name="mappingJarLocations">
        	    <list>
    		        <value>$&#123;sms.jar&#125;</value>
        	    </list>
    	    </property>
            <property name="mappingDirectoryLocations">
        	    <list>
    		        <value>classpath&#58;/com/generalynx</value>
        	    </list>
    	    </property>
            <property name="hibernateProperties">
                <props>
                    <prop key="hibernate.show_sql">$&#123;hibernate.show_sql&#125;</prop>
                    <prop key="hibernate.dialect">$&#123;hibernate.dialect&#125;</prop>
                    <prop key="hibernate.connection.release_mode">$&#123;hibernate.connection.release_mode&#125;</prop>
                    <prop key="hibernate.cache.provider_class">$&#123;hibernate.cache.provider_class&#125;</prop>
                    <prop key="hibernate.cache.use_query_cache">$&#123;hibernate.cache.use_query_cache&#125;</prop>
                    <prop key="hibernate.query.substitutions">$&#123;hibernate.query.substitutions&#125;</prop>
                    <prop key="hibernate.jdbc.use_scrollable_resultset">$&#123;hibernate.jdbc.use_scrollable_resultset&#125;</prop>
                    <prop key="hibernate.jdbc.batch_size">$&#123;hibernate.jdbc.batch_size&#125;</prop>
                    <prop key="hibernate.jdbc.batch_versioned_data">$&#123;hibernate.jdbc.batch_versioned_data&#125;</prop>
                    <prop key="hibernate.generate_statistics">$&#123;hibernate.generate_statistics&#125;</prop>
                </props>
            </property>
            <property name="eventListeners">
                <map>
                    <entry key="delete">
                        <bean id="deleteEvent" class="com.generalynx.ecos.beans.orm.BasicDeleteEventListener" />
                    </entry>
                </map>
            </property>
        </bean>
    
        <bean id="configuration" factory-bean="&amp;sessionFactory" factory-method="getConfiguration"/>
    It breaks since DefaultListableBeanFactory.getBeanNamesForType() calls isBeanTypeMatch() and this eventually calls this line

    Code:
    				if &#40;mergedBeanDefinition.getFactoryMethodName&#40;&#41; != null && mergedBeanDefinition.isSingleton&#40;&#41;&#41; &#123;
    					return getBean&#40;name&#41;.getClass&#40;&#41;;
    				&#125;
    in AbstractBeanFactory.getType(String name) method. Since 'configuration' bean is method made it is picked up. And this tries to initialize DataSource bean before PropertyPlaceholderConfigurer bean.

    This worked in previous version 1.2.1.

    Rgds, Ales

    ------
    exception stack trace:
    Code:
    org.apache.commons.dbcp.SQLNestedException&#58; Cannot load JDBC driver class '$&#123;jdbc.driverClassName&#125;'
    	at org.apache.commons.dbcp.BasicDataSource.createDataSource&#40;BasicDataSource.java&#58;766&#41;
    	at org.apache.commons.dbcp.BasicDataSource.getConnection&#40;BasicDataSource.java&#58;540&#41;
    	at org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy.afterPropertiesSet&#40;LazyConnectionDataSourceProxy.java&#58;137&#41;
    	at org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy.<init>&#40;LazyConnectionDataSourceProxy.java&#58;103&#41;
    	at sun.reflect.NativeConstructorAccessorImpl.newInstance0&#40;Native Method&#41;
    	at sun.reflect.NativeConstructorAccessorImpl.newInstance&#40;NativeConstructorAccessorImpl.java&#58;39&#41;
    	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance&#40;DelegatingConstructorAccessorImpl.java&#58;27&#41;
    	at java.lang.reflect.Constructor.newInstance&#40;Constructor.java&#58;274&#41;
    	at org.springframework.beans.BeanUtils.instantiateClass&#40;BeanUtils.java&#58;100&#41;
    	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate&#40;SimpleInstantiationStrategy.java&#58;75&#41;
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor&#40;AbstractAutowireCapableBeanFactory.java&#58;579&#41;
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean&#40;AbstractAutowireCapableBeanFactory.java&#58;322&#41;
    	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean&#40;AbstractBeanFactory.java&#58;226&#41;
    	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean&#40;AbstractBeanFactory.java&#58;147&#41;
    	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference&#40;BeanDefinitionValueResolver.java&#58;176&#41;
    	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary&#40;BeanDefinitionValueResolver.java&#58;105&#41;
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues&#40;AbstractAutowireCapableBeanFactory.java&#58;920&#41;
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean&#40;AbstractAutowireCapableBeanFactory.java&#58;731&#41;
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean&#40;AbstractAutowireCapableBeanFactory.java&#58;340&#41;
    	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean&#40;AbstractBeanFactory.java&#58;226&#41;
    	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean&#40;AbstractBeanFactory.java&#58;147&#41;
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod&#40;AbstractAutowireCapableBeanFactory.java&#58;414&#41;
    	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean&#40;AbstractAutowireCapableBeanFactory.java&#58;318&#41;
    	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean&#40;AbstractBeanFactory.java&#58;226&#41;
    	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean&#40;AbstractBeanFactory.java&#58;147&#41;
    	at org.springframework.beans.factory.support.AbstractBeanFactory.getType&#40;AbstractBeanFactory.java&#58;329&#41;
    	at org.springframework.beans.factory.support.DefaultListableBeanFactory.isBeanTypeMatch&#40;DefaultListableBeanFactory.java&#58;250&#41;
    	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType&#40;DefaultListableBeanFactory.java&#58;156&#41;
    	at org.springframework.context.support.AbstractApplicationContext.getBeanNamesForType&#40;AbstractApplicationContext.java&#58;585&#41;
    	at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors&#40;AbstractApplicationContext.java&#58;353&#41;
    	at org.springframework.context.support.AbstractApplicationContext.refresh&#40;AbstractApplicationContext.java&#58;294&#41;
    	at org.springframework.web.context.support.AbstractRefreshableWebApplicationContext.refresh&#40;AbstractRefreshableWebApplicationContext.java&#58;134&#41;
    	at org.springframework.web.context.ContextLoader.createWebApplicationContext&#40;ContextLoader.java&#58;230&#41;
    	at org.springframework.web.context.ContextLoader.initWebApplicationContext&#40;ContextLoader.java&#58;156&#41;
    	at org.springframework.web.context.ContextLoaderListener.contextInitialized&#40;ContextLoaderListener.java&#58;48&#41;
    	at org.apache.catalina.core.StandardContext.listenerStart&#40;StandardContext.java&#58;3212&#41;
    	at org.apache.catalina.core.StandardContext.start&#40;StandardContext.java&#58;3554&#41;
    	at org.apache.catalina.core.ContainerBase.start&#40;ContainerBase.java&#58;1141&#41;
    	at org.apache.catalina.core.StandardHost.start&#40;StandardHost.java&#58;707&#41;
    	at org.apache.catalina.core.ContainerBase.start&#40;ContainerBase.java&#58;1141&#41;
    	at org.apache.catalina.core.StandardEngine.start&#40;StandardEngine.java&#58;316&#41;
    	at org.apache.catalina.core.StandardService.start&#40;StandardService.java&#58;450&#41;
    	at org.apache.catalina.core.StandardServer.start&#40;StandardServer.java&#58;2143&#41;
    	at org.apache.catalina.startup.Catalina.start&#40;Catalina.java&#58;463&#41;
    	at org.apache.catalina.startup.Catalina.execute&#40;Catalina.java&#58;350&#41;
    	at org.apache.catalina.startup.Catalina.process&#40;Catalina.java&#58;129&#41;
    	at sun.reflect.NativeMethodAccessorImpl.invoke0&#40;Native Method&#41;
    	at sun.reflect.NativeMethodAccessorImpl.invoke&#40;NativeMethodAccessorImpl.java&#58;39&#41;
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke&#40;DelegatingMethodAccessorImpl.java&#58;25&#41;
    	at java.lang.reflect.Method.invoke&#40;Method.java&#58;324&#41;
    	at org.apache.catalina.startup.Bootstrap.main&#40;Bootstrap.java&#58;156&#41;

  2. #2
    Join Date
    Jul 2005
    Posts
    18

    Default

    I am seeing this same bug and tracked it down to the same bit of code indictated by alesj. The actual values are not substituted in since the bean has already been initialized with the placeholder values buy the code snippet posted above.

  3. #3
    Join Date
    Jul 2005
    Posts
    7

    Default

    I am seeing the exact same bug with 1.2.2 - looks like a regression from 1.2.1.

  4. #4
    Join Date
    Jun 2005
    Posts
    3

    Default

    I'm seeing the same problem. Worked in 1.2.1, not in 1.2.2...

    Is there a workaround or a bug report that deals with this issue?

  5. #5
    Join Date
    Jul 2005
    Posts
    18

    Default

    Check out http://opensource.atlassian.com/proj...rowse/SPR-1103

    The SourceForge CVS repository web interface does not seem to have the fix yet though. Hopefully a new version of Spring will be released soon to address this bug since it is probably a show stopper for many users.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •