Spel无法转换为地图

时间:2015-07-15 15:08:43

标签: java spring

阅读了关于Spring Expression Language的“Inline Maps”文档,我将一个对象传递给SpelExpressionParser并.toString()传递Object,可以这么说;但是,这样做,我收到以下错误:

  

org.springframework.expression.spel.standard.SpelExpression不能   强制转换为java.util.Map

Object传递给.parseExpression函数的参数是注释@PreAuthorize("hasPermission(#object, {name: 'roofus', animal: 'dog'})“附加”到方法的结果。

通过PermissionEvaluator interface实现,它以Object形式传递给方法:

private boolean doSomething (Object animal) { //....

在此方法中找到@Autowired SpelExpressionEvaluator。这可以通过以下方式使用:

Map animalMap = (Map) parser.parseExpression(animal.toString());

通过调试,我知道.toString()方法导致:{name=roofus, animal=dog}

导致上述错误。我错过了什么吗?目标是能够传递“JSON” - String(由链接文档指定)以用于评估目的。

2 个答案:

答案 0 :(得分:2)

parser.parseExpression无法独立于环境返回Map的问题。

看起来你误解了架构。 SpelParser用于从Expression构建String对象。之后,您可以使用evaluate方法之一getValue()该表达式。

因此,只有在评估之后,您才能获得Map对象:

Expression expression = parser.parseExpression("{name: 'roofus', animal: 'dog'}");
Map map = expression.getValue(Map.class);

答案 1 :(得分:0)

animal已经是Map(请注意.toString()结果的OP中的格式),而不是解析器所需的正确格式。在这种情况下,如果目标是从Map检索信息,则甚至不需要解析器:

((Map<String, String>)animal).get("animal")

因此,为了回应Artem Bilan提出的解决方案,这实际上可行:

Map animalMap = (Map) parser.parseExpression("{name: 'roofus', animal: 'dog'}").getValue();

然而,实际收到的内容(以及OP中问题的原因)是:parser.parseExpression("{name=roofus, animal=dog}")