法术不能施放到地图上



阅读了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}")

最新更新