我有一个 Spring 测试配置类,它应该覆盖 xml-config 中现有的 bean。但我的问题是 xml bean 覆盖了我的测试配置中用 primary 注释的 bean。我尝试用不同的名称命名测试 bean,但这对我也不起作用。
@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]]
如您所见,我在测试配置中的主要 bean 被覆盖,我想在测试中使用我的测试配置 bean。
我正在使用 Spring 4.3.x。
我看了很多相关的帖子,但没有一个给我答案。任何帮助,将不胜感激。
最佳答案
名称更改似乎适用于我的简化版本。
我认为这无关紧要,但 RouteConfigBuilder 和 RouteBuilder 的构造风格在 Java 和 XML 之间看起来不同。
用 4.3.20 测试
package com.stackoverflow.q53757986;
import static org.junit.Assert.*;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.junit.BeforeClass;
import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;
import org.springframework.context.annotation.Primary;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.test.context.junit4.rules.SpringClassRule;
import org.springframework.test.context.junit4.rules.SpringMethodRule;
@SuppressWarnings("javadoc")
public class CamelJmsTest {
static final String ACTIVE_MQ_HOST = "vm://activeMQ?broker.persistent=false";
/** The Constant SPRING_CLASS_RULE. */
@ClassRule
public static final SpringClassRule SPRING_CLASS_RULE = new SpringClassRule();
/** The spring method rule. */
@Rule
public final SpringMethodRule springMethodRule = new SpringMethodRule();
@BeforeClass
public static void setActiveMQ() {
System.setProperty("amq.endpoint", ACTIVE_MQ_HOST);
}
@Autowired
JmsTemplate jmsTemplate;
@Autowired
RouteConfigBuilder routeConfig;
@Autowired
RouteBuilder routeBuilder;
@Test
public void postJmsMessage() {
assertEquals("java", this.routeConfig.source);
assertEquals("java", this.routeBuilder.source);
this.jmsTemplate.send("queue/test", (MessageCreator) session -> session.createTextMessage("Hello World"));
try {
for (int i = 0; i < 100; i++) {
Thread.sleep(100);
}
} catch (Exception ignored) {}
}
@Configuration
@ImportResource("classpath:production-beans-camel-jms.xml")
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 routeConfig2() {
return new RouteConfigBuilder("java");
}
@Primary
@Bean
public RouteBuilder routeBuilder2() {
return new RouteBuilder(routeConfig2(), "java");
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="routeConfig" class="com.stackoverflow.q53757986.RouteConfigBuilder">
<constructor-arg name="source" value="xml" />
</bean>
<bean id="routeBuilder" class="com.stackoverflow.q53757986.RouteBuilder">
<constructor-arg name="routeConfig" ref="routeConfig" />
<constructor-arg name="source" value="xml" />
</bean>
</beans>
关于java - 主 spring bean 被配置中的 ImportResource 覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53757986/
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我有一个在Linux服务器上运行的ruby脚本。它不使用rails或任何东西。它基本上是一个命令行ruby脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我在pry中定义了一个函数:to_s,但我无法调用它。这个方法去哪里了,怎么调用?pry(main)>defto_spry(main)*'hello'pry(main)*endpry(main)>to_s=>"main"我的ruby版本是2.1.2看了一些答案和搜索后,我认为我得到了正确的答案:这个方法用在什么地方?在irb或pry中定义方法时,会转到Object.instance_methods[1]pry(main)>defto_s[1]pry(main)*'hello'[1]pry(main)*end=>:to_s[2]pry(main)>defhello[2]pry(main)
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
在Ruby类中,我重写了三个方法,并且在每个方法中,我基本上做同样的事情:classExampleClassdefconfirmation_required?is_allowed&&superenddefpostpone_email_change?is_allowed&&superenddefreconfirmation_required?is_allowed&&superendend有更简洁的语法吗?如何缩短代码? 最佳答案 如何使用别名?classExampleClassdefconfirmation_required?is_a
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht