【问题标题】:OGNL expression in Core Java - Access a Map with dynamic keysCore Java 中的 OGNL 表达式 - 使用动态键访问地图
【发布时间】:2012-08-03 13:31:37
【问题描述】:

我是 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 实现的是迭代列表,检索每个键,然后将该键传递给映射以检索值(用户对象),然后调用该对象的某些属性。

虽然我可以使用迭代列表

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

我的 OGNL 表达式引发以下错误 线程“主”ognl.NoSuchPropertyException 中的异常:java.lang.String.outerObj

请帮忙。我在谷歌上发现了很多关于使用带有 struts2 标签的 OGNL 的东西,但它在访问上述对象属性方面的用法并没有太多。

问候, 越野车

【问题讨论】:

    标签: java ognl


    【解决方案1】:

    如果我要实现您想要的功能,那么我可能会使用 google guava Table 对象来创建多个索引用户对象,然后您可以通过一个简单的 map.get(key) 调用来检索它.

    您在示例中的内容甚至在 API 的 guava Table wiki 教程中完全匹配。你让它变得比它必须的更复杂。 ;)

    【讨论】:

    • 感谢您的关注和回答:) 我必须为一个项目实施 OGNL,该项目要求将其用作其框架的一部分。我发布的是我面临的一个实际问题的测试原型。
    • OGNL 旨在用作对象图导航库,而不是用作通用脚本语言。我认为它不喜欢您尝试分配给局部变量。
    猜你喜欢
    • 2013-09-29
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 2014-01-17
    • 1970-01-01
    相关资源
    最近更新 更多