首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于map的OGNL选择

基于map的OGNL选择
EN

Stack Overflow用户
提问于 2013-09-16 21:42:22
回答 1查看 2.3K关注 0票数 0

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

代码语言:javascript
复制
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]}。很傻但很管用。我相信这是一个bug,但是Apache 4处于一个边缘,而OGNL 3.0.6是.我不确定它是否被维护;发行版甚至没有编译,因为它有错误的依赖项。

EN

回答 1

Stack Overflow用户

发布于 2013-09-20 21:06:03

首先,在从映射中获取值时,最好指明键的类型。例如,通过构造一个新字符串。

代码语言:javascript
复制
map[new java.lang.String(#this)]

也就是说,这个表达式返回nulls,因为这个上下文中的#this引用根对象。

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

代码语言:javascript
复制
m.put(k.toString(), "k_is_here");

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

产出如下:

代码语言:javascript
复制
value = [[k_is_here, k_is_here, k_is_here]]

更新

要从作为键传递的列表值的映射中选择值,请使用以下表达式:

代码语言:javascript
复制
#x.entrySet().{? #this.key in #root}.{#this.value}

首先,它将从map的entrySet中选择列表中的所有条目,然后获取所选条目的值。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18837807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档