Выражение OGNL в Core Java — доступ к карте с динамическими ключами

Я новичок в ОГНЛ. Я пытаюсь написать выражения OGNL в основной java для получения свойств/методов вызова.

Вот мой тестовый класс. У него есть список ключей и карта, которая использует эти ключи для хранения значений. Пожалуйста, смотрите ниже

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);

    }

}

Пользователь — это настраиваемый класс со свойствами firstName и lastName.

Чего я пытаюсь добиться с помощью выражения OGNL, так это перебрать список, получить каждый ключ, а затем передать этот ключ на карту, чтобы получить значение (объект пользователя), а затем вызвать некоторое свойство этого объекта.

Хотя я могу перебирать список, используя

'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

Пожалуйста помоги. Я нашел массу информации в Google об использовании OGNL с тегами struts2, но ничего особенного в его использовании для доступа к свойствам объекта, как указано выше.

С уважением, Сув.


person Suv    schedule 03.08.2012    source источник


Ответы (1)


Если бы я собирался реализовать функциональность, которая выглядит так, как вы хотите, я бы, вероятно, использовал объект таблицы google guava для создания объекта с несколькими индексированными пользователями, который затем можно получить с помощью одного простого вызова map.get(key).

То, что у вас есть в вашем примере, точно соответствует даже в вики-учебнике guava Table по API. Вы делаете это более сложным, чем это должно быть в противном случае. ;)

person jkuhnert    schedule 03.08.2012
comment
Спасибо за ваш интерес и ответ :) Мне нужно внедрить OGNL для проекта, который предписывает его использование как часть своей структуры. То, что я опубликовал, было тестовым прототипом реальной проблемы, с которой я столкнулся. - person Suv; 03.08.2012
comment
OGNL предназначен для работы в качестве библиотеки навигации по графу объектов, а не как язык сценариев общего назначения. Я не думаю, что ему нравится ваша попытка присвоить значение локальной переменной. - person jkuhnert; 05.08.2012