簡體   English   中英

帶地圖的OGNL選擇

[英]OGNL selection with map

這個使用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引用根對象。

通過在map之前創建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中選擇列表中所有鍵的所有條目,然后獲取所選條目的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM