У меня есть класс тестовой конфигурации Spring, который должен переопределить существующий в bean-компоненте в xml-config.Но моя проблема в том, что bean-компонент xml переопределяет bean-компонент, помеченный как primary в моем test-config.Я попытался назвать тестовый бин другим именем, но у меня это тоже не сработало.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {CamelJmsTest.TestConfig.class})
public class CamelJmsTest {
@Configuration
@ImportResource("classpath:production-beans-camel-jms.xml")
public static class TestConfig {
@Primary
@Bean
public JmsTemplate jmsTemplate() {
return new JmsTemplate(new ActiveMQConnectionFactory("", "", ACTIVE_MQ_HOST));
}
@Primary
@Bean // ideally i just want this bean to override the bean imported from the xml config
public RouteConfigBuilder routeConfig() {
return RouteConfigBuilder.builder().autoStart(true).build();
}
@Primary
@Bean
public RouteBuilder routeBuilder(@Value("${amq.endpoint}") String endpoint,
@Autowired Processor processor) {
return new RouteBuilder(routeConfig(), "", endpoint, processor);
}
}
private static final String ACTIVE_MQ_HOST = "vm://activeMQ";
@BeforeClass
public static void setActiveMQ() {
System.setProperty("amq.endpoint", ACTIVE_MQ_HOST);
}
@Autowired
JmsTemplate jmsTemplate;
@Test
public void postJmsMessage() {
jmsTemplate.send("queue/test", new MessageCreator() {
@Override
public Message createMessage(Session session) throws
JMSException {
return session.createTextMessage("Hello World");
}
});
try {
for (int i = 0; i < 100; i++) {
Thread.sleep(100);
}
} catch (Exception ignored) {
}
}
}
Вот соответствующая конфигурация xml:
<bean id="routeConfig" class="routing.RouteConfigBuilder" init-method="builder">
<constructor-arg name="redeliveryDelay" value="${<props>.redeliveryDelay}" />
<constructor-arg name="maximumRedeliveries" value="${<props>.maximumRedeliveries}" />
<constructor-arg name="autoStart" value="false" />
</bean>
<bean id="routeBuilder" class="routing.RouteBuilder">
<constructor-arg ref="routeConfig" />
<constructor-arg name="routeId" value="ROUTE_ID_1"/>
<constructor-arg name="endpoint" value="${amq.endpoint}" />
<constructor-arg name="processor" ref="myProcessor" />
</bean>
Это журналвыход.При запуске теста:
Overriding bean definition for bean 'routeConfig' with a different
definition:
replacing [Root bean: class [null]; scope=; abstract=false;
lazyInit=false; autowireMode=3; dependencyCheck=0;
autowireCandidate=true; primary=true;
factoryBeanName=CamelJmsTest.TestConfig;
factoryMethodName=routeConfig; initMethodName=null;
destroyMethodName=(inferred);
defined in CamelJmsTest]
with [Generic bean: class [RouteConfigBuilder]; scope=;
abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0;
autowireCandidate=true; primary=false; factoryBeanName=null;
factoryMethodName=null; initMethodName=builder;
destroyMethodName=null;
defined in class path resource [production-beans-camel-jms.xml.xml]]
Как вы можете видеть, мой основной компонент в конфигурации теста переопределен, и я хочу использовать в тесте мой компонент test-config.
Яиспользуя Spring 4.3.x.
Я прочитал много похожих постов, но ни один из них не дал мне ответа.Любая помощь будет оценена.