java - OGNL map 选择

标签 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 是......我不确定它是否得到维护;该发行版甚至无法编译,因为它具有错误的依赖项。

最佳答案

首先,从映射获取值时指示键的类型总是更好。例如通过构造一个新的字符串。

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

也就是说,此表达式返回 null,因为此上下文中的 #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中选择列表中key所在的所有条目,然后获取所选条目的值。

关于java - OGNL map 选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18837807/

相关文章:

java - Spring init 方法参数问题

java - 在 Java 中从 Arraylist 内引用父 Arraylist

java - 在 Mollweide 投影中获取我的世界地图中某个点的经度纬度

java - 使用投影 vector 的基本 AABB 碰撞

java - Struts2 填充列表

java - 可变数量的二维数组合并为一个大数组

java - 基本GUI程序布局定位

java - 使用投影从子表中获取特定列

jakarta-ee - Struts2中使用OGNL访问静态变量

java - 使用 <s :property/> values in Struts2 进行计算