Java表达式语言Projection为集合中的每个元素获取其他类型的新Object

时间:2014-08-16 05:37:53

标签: java expression ognl spring-el

我在下面给出了方案和问题,寻找有人提供解决方案/建议。

场景:有不同类型的业务bean对象,这些业务bean没有共同的属性,不能一般化。对于不同的任务/工作,我必须处理一种类型的业务bean的集合。在这个集合中我想要另一个MyKey类型的集合。 MyKey构造函数是:  MyKey(String buzUnit, String id, String subId) 对应于不同的business-bean,MyKey的构造函数(buzUnitidsubId)需要的值将是business-bean的不同属性,这又取决于执行任务/工作。

我喜欢根据任务/作业进行配置,并在数据库中维护配置。

问题: 我正在尝试使用任何EL(OGNL,Unified EL,MVEL,SpEL)来实现集合转换。我尝试使用OGNL,但无法获得理想的结果。

OGNL上的POC:

List<Point> points = new ArrayList<Point>();
points.add(new Point(2,3));
points.add(new Point(3,4));
points.add(new Point(4,5));

Map<String, Object> nameCtx = new HashMap<String, Object>();
nameCtx.put("buzBeanCollection", points);

Object retCollection = Ognl.getValue("buzBeanCollection.{new org.my.MyKey('job12', #this.x, #this.y) }", nameCtx);

在上面的代码中#this正在解析为根HashMap

1 个答案:

答案 0 :(得分:1)

使用MVEL工作。

List<Point> points = new ArrayList<Point>();
points.add(new Point(2,3));
points.add(new Point(3,4));
points.add(new Point(4,5));

Map<String, Object> nameCtx = new HashMap<String, Object>();
nameCtx.put("buzBeanCollection", points);

Object result = MVEL.eval("((new org.my.MyKey('job12', $.x * 2, $.y * 2)) in buzBeanCollection)", nameCtx);
System.out.println(result);

基于MVEL功能的其他结论;我发现OGNL的AST是使用ANTLR创建的,但MVEL有自己的集成Lexer-Parser,包括Subparsers。

OGNL无法进行相似的投影是否存在OGNL问题或ANTLR问题?