@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");
}
}
我有一个 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");
}
}