我有一个SpEL表达式,我正在尝试将其用于FtpMessageHandler(特别是outputHandler.setRemoteDirectoryExpressionString("headers['" + ftpOutPath + "']");
)。
通过调试,我发现此SpEL表达式未得到编译。当编译时间到来时,SpelCompilerMode
被设置为OFF
。因此,结果是表达式没有被编译,仅返回null
(而我的FTP客户端正在尝试仅写入根目录而不是我指定的根目录)。
查看Spring SpEL文档(https://docs.spring.io/spring/docs/5.3.0-SNAPSHOT/spring-framework-reference/core.html#expressions),它说,要启用SpEL编译,您需要设置属性spring.expression.compiler.mode
。我没有执行此操作-我在application.properties文件中将spring.expression.compiler.mode
设置为immediate
,但是SpelCompilerMode
仍然是OFF
。
为什么会这样?我该如何解决?
我知道有人会要求提供代码示例,但老实说,我不知道我能提供什么,因为这是Spring内部的全部内容。但是这里有一些相关代码的示例:
FtpMessageHandler:
@Value("${my.ftp.outPath}")
private String ftpOutPath;
@Bean
@ServiceActivator(inputChannel = "myChannel")
public MessageHandler getOutputHandle(){
FtpMessageHandler outputHandler = new FtpMessageHandler(mySessionFactory());
outputHandler.setRemoteDirectoryExpressionString("headers['" + ftpOutPath + "']");
return outputHandler;
}
application.yaml
spring:
expression:
compiler:
mode: immediate
my:
ftp:
outPath: myPath
我仍然不确定为什么表达式不能正确编译/解释,但是将代码更改为使用LiteralExpression
可以代替使用String。
outputHandler.setRemoteDirectoryExpression(new LiteralExpression(ftpOutPath));