即使设置了spring.expression.compiler.mode,Spring SpEL也不会编译

问题描述 投票:0回答:1

我有一个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
java spring spring-boot spring-el
1个回答
0
投票

我仍然不确定为什么表达式不能正确编译/解释,但是将代码更改为使用LiteralExpression可以代替使用String。

outputHandler.setRemoteDirectoryExpression(new LiteralExpression(ftpOutPath));

© www.soinside.com 2019 - 2024. All rights reserved.