带有堆栈跟踪"No bean factory"的警告



我开发了一个自定义的动态FTP组件来使用弹簧集成dsl。该组件在 spring-boot 1.3.0 中工作正常。但是,我不得不在我的一些集成中更新 spring-boot 以使用屏障 dsl 功能,转到 1.5.6。

从现在开始,尽管该组件仍然有效,但我会收到带有以下堆栈跟踪的警告:

pool-4-thread-1] o.s.i.expression.ExpressionUtils         : Creating EvaluationContext with no beanFactory
java.lang.RuntimeException: No beanFactory
at org.springframework.integration.expression.ExpressionUtils.createStandardEvaluationContext(ExpressionUtils.java:79)
at org.springframework.integration.util.AbstractExpressionEvaluator.getEvaluationContext(AbstractExpressionEvaluator.java:113)
at org.springframework.integration.util.AbstractExpressionEvaluator.getEvaluationContext(AbstractExpressionEvaluator.java:99)
at org.springframework.integration.util.AbstractExpressionEvaluator.evaluateExpression(AbstractExpressionEvaluator.java:169)
at org.springframework.integration.util.AbstractExpressionEvaluator.evaluateExpression(AbstractExpressionEvaluator.java:157)
at org.springframework.integration.file.DefaultFileNameGenerator.generateFileName(DefaultFileNameGenerator.java:70)
at org.springframework.integration.file.remote.RemoteFileTemplate$1.doInSession(RemoteFileTemplate.java:305)
at org.springframework.integration.file.remote.RemoteFileTemplate$1.doInSession(RemoteFileTemplate.java:283)
at org.springframework.integration.file.remote.RemoteFileTemplate.execute(RemoteFileTemplate.java:435)
at org.springframework.integration.file.remote.RemoteFileTemplate.send(RemoteFileTemplate.java:283)
at org.springframework.integration.file.remote.RemoteFileTemplate.send(RemoteFileTemplate.java:273)
at org.springframework.integration.file.remote.RemoteFileTemplate.send(RemoteFileTemplate.java:265)
at org.springframework.integration.file.remote.handler.FileTransferringMessageHandler.handleMessageInternal(FileTransferringMessageHandler.java:170)
at net.afferolab.ftp.dsl.handler.DynamicFileTransferringMessageHandler.handleMessageInternal(DynamicFileTransferringMessageHandler.java:37)

堆栈跟踪的最后一行指示我的自定义组件。

这是我的自定义 ftp 处理程序的一部分:

@Override
public void handleMessageInternal(Message<?> message) throws Exception {
DynamicSessionFactory.FtpCredentials credentials = new DynamicSessionFactory.FtpCredentials(
DynamicSessionFactory.FtpProtocol.valueOf(this.evaluateExpression(this.protocolExpression, String.class, message)),
this.evaluateExpression(this.hostExpression, String.class, message),
this.evaluateExpression(this.usernameExpression, String.class, message),
this.evaluateExpression(this.passwordExpression, String.class, message),
this.evaluateExpression(this.portExpression, Integer.class, message)
);
this.dynamicSessionFactory.setCredentials(credentials);
super.handleMessageInternal(message);
}
private <T> T evaluateExpression(Expression expression, Class<T> expectedType, Message<?> message) {
ExpressionEvaluatingMessageProcessor<T> expressionEvaluatingMessageProcessor = new ExpressionEvaluatingMessageProcessor<>(expression, expectedType);
expressionEvaluatingMessageProcessor.setBeanFactory(this.getBeanFactory());
return expressionEvaluatingMessageProcessor.processMessage(message);
}

以下是流中的用法示例:

.publishSubscribeChannel(ps -> ps
.subscribe(sf -> sf.handle(DynamicFtp.outboundAdapter()
.protocolExpression("headers[ftp_info].ftpProtocol")
.hostExpression("headers[ftp_info].ftpServerUrl")
.portExpression("headers[ftp_info].ftpServerPort")
.usernameExpression("headers[ftp_info].ftpUsername")
.passwordExpression("headers[ftp_info].ftpPassword")
.remoteDirectoryExpression("headers[ftp_info].ftpDirectory")
.autoCreateDirectory(true))
)
// ...

我想了解我是否应该担心此警告以及为什么没有通过以下方式设置豆子工厂:

expressionEvaluatingMessageProcessor.setBeanFactory(this.getBeanFactory());

谢谢。

TL;DR:您不必担心此堆栈跟踪,因为创建此异常是为了记录而不是抛出。您可以在ExpressionUtils.java:79调用doCreateContext中检查 beanFactory 是否甚至带有@Nullable。这是对"嘿,你应该完成AbstractExpressionEvaluator的构建!

我会尝试将expressionEvaluatingMessageProcessor.setBeanFactory(this.getBeanFactory())更改为expressionEvaluatingMessageProcessor.afterPropertiesSet().检查afterPropertiesSet的源代码:

@Override
public final void afterPropertiesSet() {
getEvaluationContext();
if (this.beanFactory != null) {
this.messageBuilderFactory = IntegrationUtils.getMessageBuilderFactory(this.beanFactory);
}
onInit();
}

由于您的自定义 ftp 处理程序没有完整的代码,因此我假设它的this.beanFactory返回 null,而AbstractExpressionEvaluator.afterPropertiesSet中的上下文不是

最新更新