@Profile Spring 骆驼注解

@Profile Spring Annotation in Camel

我有一个 Spring Boot + Apache Camel 项目,效果非常好。我只是添加了一个新的 bean,虽然我希望它的实现是特定于配置文件的。我创建了 Spring 测试来验证它,它按预期工作,但是当我 运行 服务器时,我得到以下堆栈跟踪:

原因:org.apache.camel.NoSuchBeanException:在注册表中找不到 bean:MyFancyBean
    在 org.apache.camel.component.bean.RegistryBean.getBean(RegistryBean.java:94)
    在 org.apache.camel.model.language.MethodCallExpression.createExpression(MethodCallExpression.java:196)
    在 org.apache.camel.model.language.MethodCallExpression.createPredicate(MethodCallExpression.java:210)
    在 org.apache.camel.model.language.ExpressionDefinition.createPredicate(ExpressionDefinition.java:148)
    在 org.apache.camel.model.ValidateDefinition.createProcessor(ValidateDefinition.java:63)
    在 org.apache.camel.model.ValidateDefinition.createProcessor(ValidateDefinition.java:35)
    在 org.apache.camel.model.ProcessorDefinition.makeProcessorImpl(ProcessorDefinition.java:545)
    在 org.apache.camel.model.ProcessorDefinition.makeProcessor(ProcessorDefinition.java:506)
    在 org.apache.camel.model.ProcessorDefinition.addRoutes(ProcessorDefinition.java:222)
    在 org.apache.camel.model.RouteDefinition.addRoutes(RouteDefinition.java:1068)

我有一个接口和两个实现:

public interface MyFancyBean { ... }

public class FooFancyBean implements MyFancyBean { ... }

public class NonFooFancyBean implements MyFancyBean { ... }

根据配置文件,正确的 bean 被读取实例化:

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

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

我已经通过多种方式验证了它的有效性。首先,几个测试:

@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"

所以测试有效。

此外,当我启动我的应用程序时,根据配置文件调用上面我的@Configuration class 中的正确 bean。

但是 Camel 仍然很生气并在启动时说 "NoSuchBeanException"。

FWIW,这是我引用 bean 的方式:

@Component
public class MyCamelRoute extends RouteBuilder {

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


}

如何让 Camel 支持此配置?

哇哦......今天你们都将成为我的 rubber duck。我只是自动装配它。 (这对我的处理器不起作用,这就是我最初没有想到的原因。)

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

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