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

场景:有不同类型的业务Bean对象,这些业务Bean不具有公共属性,因此不能被概括。对于不同的任务/工作,我必须处理一种类型的业务bean的集合。在这个集合中,我想要另一个MyKey类型的集合。 MyKey构造函数是:
 MyKey(String buzUnit, String id, String subId)
对应于不同的业务bean,我需要MyKey的构造函数(buzUnitidsubId)的值将成为业务bean的不同属性,而该属性又取决于执行task / job。

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

问题:
我正在尝试使用任何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

最佳答案

使用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问题?

10-02 22:46