为什么我在使用 RemoteFileTemplate 时会在日志中收到意外的 RuntimeException 警告?
Why do I get an unexpected RuntimeException warn in the logs when using RemoteFileTemplate?
我正在使用 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 (调用 class 已经实现了 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);
}
有什么线索吗?
在 Spring ApplicationContext
.
之外构造 RFT 时,您需要调用 afterPropertiesSet()
来完成 RFT 的初始化
许多 Spring 集成组件都是如此。
实施 Lifecycle
(非 RFT)的那些可能还需要 start()
ed。
您只需在日志中添加以下行
<logger name="org.springframework.integration.expression.ExpressionUtils">
<level value="ERROR"/>
<appender-ref ref="console" />
</logger>
那么你不会收到这个警告..我希望
我正在使用 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 (调用 class 已经实现了 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);
}
有什么线索吗?
在 Spring ApplicationContext
.
afterPropertiesSet()
来完成 RFT 的初始化
许多 Spring 集成组件都是如此。
实施 Lifecycle
(非 RFT)的那些可能还需要 start()
ed。
您只需在日志中添加以下行
<logger name="org.springframework.integration.expression.ExpressionUtils">
<level value="ERROR"/>
<appender-ref ref="console" />
</logger>
那么你不会收到这个警告..我希望