【问题标题】:spring SPEL add hard coded string to expressionspring SPEL 将硬编码字符串添加到表达式
【发布时间】:2014-12-24 07:14:19
【问题描述】:

我们想将一个硬编码的字符串附加到计算的表达式中。使用 SPEL 可以吗?

例子:

我有一个 Employee 类,它有一个字符串集合。 List<String> codes;

我可以使用以下表达式获取此集合。

expression = expressionParser.parseExpression("codes");
List<String> evaluatedCodes = (List<String>) expression.getValue(evaluationContext);
System.out.println(" evaluatedCodes " + evaluatedCodes);

我想在输出前加上一个字符串 .

expression = expressionParser.parseExpression("'PREFIX' + codes");
List<String> evaluatedCodes = (List<String>) expression.getValue(evaluationContext);
System.out.println(" evaluatedCodes " + evaluatedCodes);

这不起作用。有什么办法可以在输出前加上硬编码字符串?

我得到以下异常

java.lang.ClassCastException:java.lang.String 无法转换为 java.util.List 在 com.muhad.spel.ExampleConfigurationTests.testSPEL(ExampleConfigurationTests.java:103) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:601)

谢谢

生活

【问题讨论】:

    标签: spring spring-el


    【解决方案1】:

    请展开

    它不起作用。

    我刚刚测试了它,它对我来说很好用......

    public class Foo {
    
        public List<String> getCodes() {
            return Arrays.asList(new String[] {"foo", "bar"});
        }
    }
    
    ...
        Expression e = new SpelExpressionParser().parseExpression("'foo' + codes");
        Object value = e.getValue(evalCtx, new Foo());
        System.out.println(value);
    

    产生foofoo,bar

        Expression e = new SpelExpressionParser().parseExpression("'foo' + codes.toString()");
    

    产生foo[foo, bar]

    不同之处在于,在第一种情况下,转换服务会将列表转换为字符串,而不是简单的toString()

    编辑

    抱歉,我错过了您想要返回修改后值的列表;上述解决方案产生字符串。

    要为每个值添加前缀,您需要使用Collection Projection...

    Expression e = new SpelExpressionParser().parseExpression("codes.!['foo' + #this]");
    

    【讨论】:

    • 感谢您的宝贵时间和详细解释。会试试的。
    • 更新了异常跟踪。我尝试了使用和不使用 toString 。在字符串连接之后,评估的输出不会仍然是 List 吗?
    • 我希望最终输出为 foofoo ,在您的示例中为 foobar 。基本上“foo”应该作为集合中每个字符串的前缀
    • 谢谢。那行得通。我使用过投影,但无法得到这个表达式。现在我明白了投影是如何工作的。
    猜你喜欢
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    • 2015-06-29
    • 2017-08-01
    • 1970-01-01
    相关资源
    最近更新 更多