这个使用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是……我不确定它是否得到维护。该发行版甚至没有编译,因为它具有错误的依赖关系。 最佳答案
首先,从映射中获取值时总是最好指示键的类型。例如,通过构造一个新的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]]
更新资料
要从映射中选择具有作为键传递的列表值的值,请使用以下表达式:
#x.entrySet().{? #this.key in #root}.{#this.value}
首先,它将从map的
entrySet
中选择列表中的键的所有条目,然后获取所选条目的值。