我在下面给出了方案和问题,正在寻找可以提供解决方案/建议的人员。
场景:有不同类型的业务Bean对象,这些业务Bean不具有公共属性,因此不能被概括。对于不同的任务/工作,我必须处理一种类型的业务bean的集合。在这个集合中,我想要另一个MyKey
类型的集合。 MyKey
构造函数是:
MyKey(String buzUnit, String id, String subId)
对应于不同的业务bean,我需要MyKey的构造函数(buzUnit
,id
和subId
)的值将成为业务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问题?