1

私はOGNLを初めて使用します。プロパティを取得したりメソッドを呼び出したりするために、コアJavaでOGNL式を記述しようとしています。

これが私のテストクラスです。キーのリストと、これらのキーを使用して値を格納するマップがあります。下記を参照してください

package ognl.test;
import java.util.List;
import java.util.Map;

public class OGNLTestProg {

    List<String> keys = null;
    Map<String, Object> data = null;

    public OGNLTestProg(List<String> keys, Map<String, Object> data){
        this.keys = keys;
        this.data = data;
    }

    public List<String> getKeys(){
        return keys;
    }

    public Object getData(String key){
        return data.get(key);
    }
}

上記のクラスのオブジェクトをインスタンス化し、OGNLを使用していくつかのメソッドを呼び出すテストプログラムを次に示します。

package ognl.test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import ognl.Ognl;

public class Test { 
    public static void main(String[] args) throws Exception {
        String str1 = "1";
        String str2 = "2";
        List<String> keys = new ArrayList<String>();
        keys.add(str1);
        keys.add(str2);

        User u1 = new User();
        u1.setFirstName("x");
        u1.setLastName("y");

        User u2 = new User();
        u2.setFirstName("x1");
        u2.setLastName("y1");

        Map<String, Object> data = new HashMap<String, Object>();
        data.put(str1, u1);
        data.put(str2, u2);

        OGNLTestProg o = new OGNLTestProg(keys, data);

        /**
        #{
            #outerObj = #this,
            'users': getKeys().
                {
                    #{  
                    #user = outerObj.getData(#this),
                    #{
                        'firstName': user.getFirstName(),
                        'lastName':user.getLastName()
                    }       
                   }
                }
            }
         */
        Object expression1 = Ognl.parseExpression("#{"+
                  "#outerObj = #this,"+
                  "'users': getKeys()."+
                    "{"+                     
                      "#{"+
                        "#user = outerObj.getData(#this),"+
                        "#{ 'firstName': user.getFirstName(),"+
                            "'lastName':user.getLastName()"+
                        "}"+        
                       "}" +
                       "}"+
                 "}");


        Map<String,Object> map = (Map<String,Object>)Ognl.getValue(expression1, o);

    }

}

Userは、firstNameとlastNameをプロパティとして持つカスタムクラスです。

OGNL exprを使用して達成しようとしているのは、リストを繰り返し、各キーを取得してから、そのキーをマップに渡して値(Userオブジェクト)を取得し、そのオブジェクトのプロパティを呼び出すことです。

私はを使用してリストを繰り返すことができますが

'users': getKeys().{
        //I need to access the getData() method of the root object here passing the current #this object
 }

私のOGNL式は、スレッド "main" ognl.NoSuchPropertyExceptionで次のエラー例外をスローします:java.lang.String.outerObj

助けてください。struts2タグでOGNLを使用することについて、グーグルでたくさんのものを見つけましたが、上記のようなオブジェクトプロパティにアクセスするための使用法については何もありません。

よろしく、Suv

4

1 に答える 1

0

あなたが望むように見える機能を実装するつもりなら、おそらくGoogle guava Tableオブジェクトを使用して、単一の単純な map.get(key) 呼び出しで取得できる複数のインデックス付きユーザーオブジェクトを作成します。

あなたの例にあるものは、API の guava Table wiki チュートリアルでも正確に一致しています。それ以外の場合よりも複雑にしています。;)

于 2012-08-03T13:50:05.417 に答える