2017-10-19 12 views
0

J'ai un projet Spring Boot + Apache Camel qui fonctionne avec brio. Je viens d'ajouter un nouveau bean si je voulais que sa mise en œuvre soit spécifique au profil. Je créé des tests de printemps pour le vérifier, et il fonctionne comme prévu, mais quand je lance le serveur je reçois la trace de la pile suivante:@Profile Spring Annotation en Camel

 
Caused by: org.apache.camel.NoSuchBeanException: No bean could be found in the registry for: MyFancyBean 
    at org.apache.camel.component.bean.RegistryBean.getBean(RegistryBean.java:94) 
    at org.apache.camel.model.language.MethodCallExpression.createExpression(MethodCallExpression.java:196) 
    at org.apache.camel.model.language.MethodCallExpression.createPredicate(MethodCallExpression.java:210) 
    at org.apache.camel.model.language.ExpressionDefinition.createPredicate(ExpressionDefinition.java:148) 
    at org.apache.camel.model.ValidateDefinition.createProcessor(ValidateDefinition.java:63) 
    at org.apache.camel.model.ValidateDefinition.createProcessor(ValidateDefinition.java:35) 
    at org.apache.camel.model.ProcessorDefinition.makeProcessorImpl(ProcessorDefinition.java:545) 
    at org.apache.camel.model.ProcessorDefinition.makeProcessor(ProcessorDefinition.java:506) 
    at org.apache.camel.model.ProcessorDefinition.addRoutes(ProcessorDefinition.java:222) 
    at org.apache.camel.model.RouteDefinition.addRoutes(RouteDefinition.java:1068) 

j'ai une interface et deux implémentations:

public interface MyFancyBean { ... } 

public class FooFancyBean implements MyFancyBean { ... } 

public class NonFooFancyBean implements MyFancyBean { ... } 

Selon sur le profil, le bean correct est lu instancié:

@Configuration 
public class AppConfig { 
    @Bean 
    @Profile("foo") 
    MyFancyBean fooBean() { 
     return new FooFancyBean(); 
    } 

    @Bean 
    @Profile("!foo") 
    MyFancyBean nonFooBean() { 
     return new NonFooFancyBean(); 
    } 
} 

J'ai vérifié que cela fonctionne de plusieurs façons. Tout d'abord, un couple de tests:

@ActiveProfiles("anything-but-foo") 
@RunWith(SpringJUnit4ClassRunner.class) 
@ComponentScan(basePackages = {"com.example", "com.jtv.spring.boot"}) 
@EnableAutoConfiguration 
@Component 
public class NonFooBean_SpringTest { 

    @Autowired 
    private MyFancyBean bean; 

    @Test 
    // ... here "bean" is instantiated as "NonFooFancyBean" 

Ainsi, le test fonctionne.

En outre, lorsque je démarre mon application, en fonction du profil, le bean correct de ma classe @Configuration ci-dessus est appelé.

Mais Camel est toujours en colère et dit "NoSuchBeanException" au démarrage.

FWIW, voici comment je fais référence la fève:

@Component 
public class MyCamelRoute extends RouteBuilder { 

    @Override 
    public void configure() throws Exception { 
     // [...] 
     from("direct:processStuff"). 
     validate().method("MyFancyBean"). 
     process("MyProcessor"); 
    } 


} 

Comment puis-je obtenir Camel pour honorer cette config?

Répondre

1

Whoooo ... Vous pouvez devenir mon rubber duck aujourd'hui. Je l'ai juste autowired. (Cela ne fonctionne pas pour mon processeur, ce qui est la raison pour laquelle il n'y a pas eu à me initialement.)

@Component 
public class MyCamelRoute extends RouteBuilder { 
    @Override 
    public void configure() throws Exception { 
     // [...] 
     @Autowired MyFancyBean myFancyBean; 

     from("direct:processStuff"). 
     validate().method(myFancyBean). 
     process("MyProcessor"); 
    } 
} 
+0

(Il ne faut pas répondre à ma propre question pendant deux jours ... ce qui est à ce sujet?) – inanutshellus

+0

Hehe .. canard en caoutchouc. – Pytry