gpt4 book ai didi

java - 以编程方式设置 Spring 集成路由器属性

转载 作者:行者123 更新时间:2023-12-01 08:48:54 24 4
gpt4 key购买 nike

我们有一个使用带有表达式的路由器的 Spring 集成路由。该表达式在 yml 文件中设置。我想创建单元测试手动设置此路由器属性的值,但它似乎不起作用。

测试

@Autowired
EventDrivenConsumer myrouter;
.....
((ExpressionEvaluatingRouter) myrouter.getHandler()).setPrimaryExpression(new SpelExpressionParser().doParseExpression("true"));

XML 上下文的一部分

<int:router input-channel="catchweightExcluderChannel" expression="${rip.config.exclude_catchweight}" default-output-channel="productTransformerChannel">
<int:mapping value="true" channel="catchWeightFilteringChannel" />
<int:mapping value="false" channel="productTransformerChannel" />
</int:router>

但似乎我的值覆盖并没有影响行为...似乎一旦 Spring 读取上下文,更改组件的属性就不会影响其行为。

最佳答案

您无法以这种方式更改属性,因为表达式是 ExpressionEvaluatingRouter 的构造函数:

public class ExpressionEvaluatingRouter extends AbstractMessageProcessingRouter {

public ExpressionEvaluatingRouter(Expression expression) {
super(new ExpressionEvaluatingMessageProcessor<Object>(expression));
setPrimaryExpression(expression);
}

}

我认为对于您的测试用例,@TestPropertySource 将是最好的解决方案:

@RunWith(SpringRunner.class)
@TestPropertySource(properties = "rip.config.exclude_catchweight:true")

更新

but then why is there a mutator called setPrimaryExpression

setPrimaryExpression() 及其同级 getExpression() 用于可视化工具和日志,使基于表达式的组件更易于分析。由于一个组件可能有多个表达式,因此我们决定区分一个 prime 表达式,从而区分 setter 的名称。

表达式求值的真正艰苦工作是在 ExpressionEvaluatingMessageProcessor 中完成的,正如我们所见,它也是基于 ctor 的。

对于您的每个方法的要求,我只能建议手动创建 ApplicationContext 并调用它的 setEnvironment(new MockEnvironment())。您已经可以在其中填充所需的值该表达式在特定情况下。

当您的应用程序上下文已启动时,您无法覆盖基于 ctor 的初始化。

关于java - 以编程方式设置 Spring 集成路由器属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42510980/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com