阅读了Spring表达式语言的"内联映射"文档后,我将对象传递给SpelExpressionParser并将.toString()
添加到Object
中,可以这么说;然而,在这样做时,我收到以下错误:
org.springframework.expression.spel.standard。SpelExpression不能为转换为java.util.Map
传递给.parseExpression
函数作为参数的Object
是"附加"到方法上的注释@PreAuthorize("hasPermission(#object, {name: 'roofus', animal: 'dog'})
的结果。
通过PermissionEvaluator
接口实现,它以Object
形式传递给一个方法:
private boolean doSomething (Object animal) { //....
在这个方法中找到一个@Autowired
SpelExpressionEvaluator
。它的用法如下:
Map animalMap = (Map) parser.parseExpression(animal.toString());
通过调试,我知道.toString()
方法的结果是:{name=roofus, animal=dog}
导致上述错误。我错过什么了吗?目标是能够传入一个"JSON"式的String
(由链接的文档指定)用于评估目的。
您的parser.parseExpression
不能独立于环境返回Map
的问题。
看起来你对架构有一点误解。SpelParser
用于从String
构建Expression
对象。之后,您可以使用它的getValue()
方法之一来evaluate
该表达式。
因此,只有在求值之后才能得到Map
对象:
Expression expression = parser.parseExpression("{name: 'roofus', animal: 'dog'}");
Map map = expression.getValue(Map.class);
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}")