Я новичок в ОГНЛ. Я пытаюсь написать выражения 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, но ничего особенного в его использовании для доступа к свойствам объекта, как указано выше.
С уважением, Сув.