[ 
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)

Reply via email to