java - 堆栈跟踪警告 "No bean factory"

标签 java spring spring-boot spring-integration-dsl

我开发了一个自定义动态 FTP 组件来使用 spring integration dsl。该组件适用于 spring-boot 1.3.0。但是,我必须在我的一些集成中更新 spring-boot 以使用 barrier 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))
            )
 // ...

我想知道我是否应该担心这个警告以及为什么 bean 工厂没有通过以下方式设置:

expressionEvaluatingMessageProcessor.setBeanFactory(this.getBeanFactory());

谢谢。

最佳答案

TL;DR:您不必担心此堆栈跟踪,因为创建此异常是为了记录而不是抛出。您可以在调用 doCreateContextExpressionUtils.java:79 处检查 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 中的上下文不是

关于java - 堆栈跟踪警告 "No bean factory",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51863556/

相关文章:

java - 如何收集DoubleStream到List

spring - 运行测试时跳过 JPA 生命周期方法

java - GWT 和 Spring MVC,值得吗?

spring-boot - 如何使用 Spring Boot 连接外部/在线 LDAP 服务器?

spring-boot - 当 token 不再有效时,Spring 安全 OAuth 身份验证不会过期

java - 空校验编码标准

java - Java 平台独立性将如何运作?

java - 在executeUpdate Java MySQL 中出现错误

Spring aop 和 Jersey 类(class)

java - 当前线程的范围 'request' 不活动 - websocket 版本