[ https://issues.apache.org/jira/browse/CAMEL-13543?focusedWorklogId=244668&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-244668 ]
ASF GitHub Bot logged work on CAMEL-13543: ------------------------------------------ Author: ASF GitHub Bot Created on: 19/May/19 13:57 Start Date: 19/May/19 13:57 Worklog Time Spent: 10m Work Description: oscerd commented on pull request #2928: CAMEL-13543 (master) URL: https://github.com/apache/camel/pull/2928 ---------------------------------------------------------------- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: us...@infra.apache.org Issue Time Tracking ------------------- Worklog Id: (was: 244668) Time Spent: 0.5h (was: 20m) > @PropertyInject is broken for Spring projects using > CamelTestContextBootstrapper > -------------------------------------------------------------------------------- > > Key: CAMEL-13543 > URL: https://issues.apache.org/jira/browse/CAMEL-13543 > Project: Camel > Issue Type: Bug > Components: camel-spring, camel-test > Affects Versions: 2.24.0 > Reporter: Stig Rohde Døssing > Assignee: Andrea Cosentino > Priority: Minor > Fix For: 3.0.0, 2.24.1, 2.25.0 > > Time Spent: 0.5h > Remaining Estimate: 0h > > I'm trying to override properties in a Camel Spring project. In my production > code, I have > a field injected with > @Component > public class MyRouteBuilder extends SpringRouteBuilder { > @PropertyInject("{{MY_PROPERTY}} ") > private String myProperty; > } > I normally load the value from a properties file using a > BridgePropertyPlaceholderConfigurer. > In one of my tests, I'd like to replace the property. My test looks as > follows: > @RunWith(CamelSpringRunner.class) > @BootstrapWith(CamelTestContextBootstrapper.class) > @ContextConfiguration(locations = { > "classpath:META-INF/spring/my-properties.xml" > }) > @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) > @UseAdviceWith > public class CitizenLookupPatientByOIDRouteTest { > @Test > public void test() { > ... > } > @UseOverridePropertiesWithPropertiesComponent > public static Properties overrideProperties() { > Properties overrides = new Properties(); > overrides.setProperty("MY_PROPERTY", "some-value"); > return overrides; > } > } > What I am seeing is that the injected field gets the value from the > properties file, rather > than the overridden value. Debugging this, I see that the field injection > happens during Spring > bean postprocessing, which is before the overrideProperties method is called. > parseUri:190, PropertiesComponent (org.apache.camel.component.properties) > parseUri:178, PropertiesComponent (org.apache.camel.component.properties) > resolvePropertyPlaceholders:2547, DefaultCamelContext (org.apache.camel.impl) > getInjectionPropertyValue:276, CamelPostProcessorHelper > (org.apache.camel.impl) > injectFieldProperty:214, DefaultCamelBeanPostProcessor (org.apache.camel.impl) > doWith:174, DefaultCamelBeanPostProcessor$1 (org.apache.camel.impl) > doWithFields:74, ReflectionHelper (org.apache.camel.util) > injectFields:170, DefaultCamelBeanPostProcessor (org.apache.camel.impl) > postProcessBeforeInitialization:83, DefaultCamelBeanPostProcessor > (org.apache.camel.impl) > postProcessBeforeInitialization:154, CamelBeanPostProcessor > (org.apache.camel.spring) > applyBeanPostProcessorsBeforeInitialization:419, > AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support) > initializeBean:1737, AbstractAutowireCapableBeanFactory > (org.springframework.beans.factory.support) > doCreateBean:576, AbstractAutowireCapableBeanFactory > (org.springframework.beans.factory.support) > createBean:498, AbstractAutowireCapableBeanFactory > (org.springframework.beans.factory.support) > lambda$doGetBean$0:320, AbstractBeanFactory > (org.springframework.beans.factory.support) > getObject:-1, 1286771084 > (org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$40) > getSingleton:222, DefaultSingletonBeanRegistry > (org.springframework.beans.factory.support) > doGetBean:318, AbstractBeanFactory (org.springframework.beans.factory.support) > getBean:199, AbstractBeanFactory (org.springframework.beans.factory.support) > preInstantiateSingletons:846, DefaultListableBeanFactory > (org.springframework.beans.factory.support) > finishBeanFactoryInitialization:863, AbstractApplicationContext > (org.springframework.context.support) > refresh:546, AbstractApplicationContext (org.springframework.context.support) > loadContext:152, CamelSpringTestContextLoader (org.apache.camel.test.spring) > loadContext:89, CamelSpringTestContextLoader (org.apache.camel.test.spring) > loadContextInternal:99, DefaultCacheAwareContextLoaderDelegate > (org.springframework.test.context.cache) > loadContext:117, DefaultCacheAwareContextLoaderDelegate > (org.springframework.test.context.cache) > getApplicationContext:108, DefaultTestContext > (org.springframework.test.context.support) > injectDependencies:118, DependencyInjectionTestExecutionListener > (org.springframework.test.context.support) > prepareTestInstance:83, DependencyInjectionTestExecutionListener > (org.springframework.test.context.support) > prepareTestInstance:246, TestContextManager (org.springframework.test.context) > createTest:227, SpringJUnit4ClassRunner > (org.springframework.test.context.junit4) > The code causing the injection in CamelSpringContextLoader is this > https://github.com/apache/camel/blob/camel-2.23.1/components/camel-test-spring/src/main/java/org/apache/camel/test/spring/CamelSpringTestContextLoader.java#L152. > A few lines below, the properties override code is called. > The issue here is that Spring is responsible for injecting the property value > into the @PropertyInject field, but CamelSpringTestContextLoader first loads > the Spring context, thus causing field injection, and then sets the property > overrides. > I'll put up a PR with a proposal for a fix shortly. -- This message was sent by Atlassian JIRA (v7.6.3#76005)