阅读了关于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
(由链接文档指定)以用于评估目的。
答案 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}")