OGNL选择与地图

时间:2013-09-16 21:42:22

标签: java projection ognl

这个使用OGNL的简单程序返回一个空值列表而不是[A,B,D]。我已经尝试#root{#x.get(#this)}并仍然返回一个空值列表。为什么?感谢。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


import ognl.Ognl;



public class ognlTest {
    static public void main(String[] args) throws Exception
    {
        Map<String, Object> m = new HashMap<String, Object>();

        m.put("a", "A");
        m.put("b", "B");
        m.put("c", "C");
        m.put("d", "D");

        List<String> k = new ArrayList<>();
        k.add("a");
        k.add("b");
        k.add("d");


        Map<String, Object> context = new HashMap<String, Object>();
        context.put("x", m);

        Object expression = Ognl.parseExpression( "#root.{ #x[#this] }");

        Object value = Ognl.getValue( expression, context, k);

        System.out.println("value = [" + value + "]");

    }
}

更新

使用#root.{#z=#this, #x[#z]}。傻但是有效。我相信这是一个错误,但Apache OGNL 4处于不确定状态,而OGNL 3.0.6是......我不确定它是否已被维护;分发甚至没有编译,因为它有错误的依赖。

1 个答案:

答案 0 :(得分:1)

首先,从地图获取值时,最好指示键的类型。例如,通过构造一个新的String。

map[new java.lang.String(#this)]

也就是说,此表达式返回空值,因为此上下文中的#this引用了根对象。

您可以通过在映射之前创建k列表并将k.toString()作为键来轻松验证这一点。

m.put(k.toString(), "k_is_here");

Object expression = Ognl
                   .parseExpression("#root.{ #x[new java.lang.String(#this)] }");

输出将是:

value = [[k_is_here, k_is_here, k_is_here]]

<强>更新

要从map中选择值,并将列表值作为键传递,请使用以下表达式:

#x.entrySet().{? #this.key in #root}.{#this.value}

首先,它会从地图的entrySet中选择所有条目中哪个键位于列表中,然后获取所选条目的值。