0

OGNL を使用したこの単純なプログラムは、[A,B,D] ではなく null 値のリストを返します。試してみましたが#root{#x.get(#this)}、まだ null のリストが返されます。なんで?ありがとう。

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 は ... 維持されているかどうかわかりません。依存関係が間違っているため、ディストリビューションはコンパイルさえしません。

4

1 に答える 1

2

まず第一に、マップから値を取得するときは常にキーのタイプを示す方が良いです。たとえば、新しい文字列を作成します。

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

#thisつまり、このコンテキストではルート オブジェクトを参照するため、この式は null を返します。

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}

最初entrySetに、リスト内のキーがマップされているすべてのエントリから選択し、選択したエントリの値を取得します。

于 2013-09-20T21:06:03.310 に答える