为啥我在使用 RemoteFileTemplate 时会在日志中收到意外的 RuntimeException 警告?

Posted

技术标签:

【中文标题】为啥我在使用 RemoteFileTemplate 时会在日志中收到意外的 RuntimeException 警告?【英文标题】:Why do I get an unexpected RuntimeException warn in the logs when using RemoteFileTemplate?为什么我在使用 RemoteFileTemplate 时会在日志中收到意外的 RuntimeException 警告? 【发布时间】:2015-06-19 21:51:39 【问题描述】:

我正在使用 Spring-integration 4.1.1.RELEASE 并拥有将消息有效负载中的文件上传到远程 sFtp 共享的代码。我正在使用这样初始化的 sFtpRemoteFileTemplate:

Expression remoteDirectoryExpression = new  LiteralExpression("si.sftp.sample");
SpelExpressionParser parser = new SpelExpressionParser();
Expression fileNameExpression = parser.parseExpression("payload.name");

template = new SftpRemoteFileTemplate(sessionFactory);
template.setCharset("UTF-8");
template.setBeanFactory(beanFactory);
template.setAutoCreateDirectory(true);
template.setRemoteDirectoryExpression(remoteDirectoryExpression);
template.setFileNameExpression(fileNameExpression);
template.setTemporaryFileSuffix(".writing");
template.setUseTemporaryFileName(true);

但是,在运行代码时,此警告会出现在我的日志文件中 - 模板中的每个表达式都会出现一次:

WARN   - o.s.i.e.ExpressionUtils: Creating EvaluationContext with no beanFactory
java.lang.RuntimeException: No beanfactory
at org.springframework.integration.expression.ExpressionUtils.createStandardEvaluationContext(ExpressionUtils.java:79) [spring-integration-core-4.1.1.RELEASE.jar:na]
at org.springframework.integration.util.AbstractExpressionEvaluator.getEvaluationContext(AbstractExpressionEvaluator.java:114) [spring-integration-core-4.1.1.RELEASE.jar:na]
at org.springframework.integration.util.AbstractExpressionEvaluator.getEvaluationContext(AbstractExpressionEvaluator.java:100) [spring-integration-core-4.1.1.RELEASE.jar:na]
at org.springframework.integration.util.AbstractExpressionEvaluator.evaluateExpression(AbstractExpressionEvaluator.java:164) [spring-integration-core-4.1.1.RELEASE.jar:na]
at org.springframework.integration.util.AbstractExpressionEvaluator.evaluateExpression(AbstractExpressionEvaluator.java:123) [spring-integration-core-4.1.1.RELEASE.jar:na]
at org.springframework.integration.handler.ExpressionEvaluatingMessageProcessor.processMessage(ExpressionEvaluatingMessageProcessor.java:72) [spring-integration-core-4.1.1.RELEASE.jar:na]

这是为什么呢?我还没有设法摆脱它,我怀疑 Bean Factory 实例没有委托给 RemoteFileTemplate 内的 ExpressionEvaluatingMessageProcessor (调用类已实现 BeanFactoryAware 并且我已验证 beanFactory 字段已正确填充)。我为它创建了一个测试用例,并成功地重现了它。

@Test
public void shouldUploadFile() throws Exception

  Message<File> msg = MessageBuilder
    .withPayload(Fixture.getFile())
    .build();

  final String remoteDir = template.send(msg);
  org.junit.Assert.assertNotNull("remote file must exist", remoteDir);
  logger.info("uploaded file: \'\'", remoteDir);
  SftpTestUtils.cleanUp(template, Fixture.getFileName());

ExpressionEvaluatingMessageProcessor 应该没有问题,因为这个测试用例在相同的上下文中通过而没有警告:

@Test
public void shouldTestProcessor()

  SpelExpressionParser parser = new SpelExpressionParser();
  Expression fileNameExpression = parser.parseExpression("payload.name");
  ExpressionEvaluatingMessageProcessor<String> fileNameProcessor = new ExpressionEvaluatingMessageProcessor<String>(
      fileNameExpression, String.class);
  fileNameProcessor.setBeanFactory(beanFactory);
  Message<File> message = MessageBuilder.withPayload(Fixture.getFile()).build();
  String fileName = fileNameProcessor.processMessage(message);
  org.junit.Assert.assertEquals("filename is not as expected", Fixture.getFileName(), fileName);
  logger.info("generated fileName: \'\'", fileName);

有什么线索吗?

【问题讨论】:

【参考方案1】:

在 Spring ApplicationContext 之外构造 RFT 时,您需要调用 afterPropertiesSet() 来完成 RFT 的初始化。

许多 Spring Integration 组件都是如此。

那些实现Lifecycle(不是RFT)的人可能还需要start()ed。

【讨论】:

感谢您的回答,Gary - 这太明显了! 你能解释一下我应该在哪里打电话给afterPropertiesSet()吗? “属性设置后”看起来合理吗?在这种情况下,在template.setUseTemporaryFileName(true); 之后。但是,让 Spring 为您管理 bean 通常会更好,而您不必处理类似的事情。【参考方案2】:

您只需在日志中添加以下行

<logger name="org.springframework.integration.expression.ExpressionUtils"> <level value="ERROR"/> <appender-ref ref="console" /> </logger>

那么你不会收到这个警告..我希望

【讨论】:

以上是关于为啥我在使用 RemoteFileTemplate 时会在日志中收到意外的 RuntimeException 警告?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在使用 Mock 注释时有 NPE

为啥我在使用 foreach 时会收到 ***Error?

为啥我在使用任务时无法正确填充集合? [复制]

为啥我在使用 Jetpack Compose TextField 时会出错?

当我在模型中使用 withAnimation 时,没有动画发生,为啥?

为啥我在使用 WideCharToMultiByte 时得到错误的字符数组?