在 Spring SpEL 中转义 MongoDB 正则表达式字符 - 获取 SpelParseException

Escape MongoDB regex character in Spring SpEL - getting SpelParseException

我正在尝试覆盖 MongoRepository::findAll() 方法来定义自定义 @Query。我正在按照 SpEL JPA Query support docs 在 MongoRepository 中使用类似的逻辑来检查用户角色并创建动态查询以获取授权记录。

我在扩展 MongoRepository 的 BlogRepository 中设置了以下方法:

@Query("{ user_id : ?#{ hasRole('ROLE_ADMIN') ?  /./  : principal.userId } } ")
@Override
Page<Blog> findAll(Pageable pageable);

我从这个方法中得到以下错误:

org.springframework.expression.spel.SpelParseException: EL1049E:(pos 31): Unexpected data after '.': 'div(/)'
    at org.springframework.expression.spel.standard.InternalSpelExpressionParser.raiseInternalException(InternalSpelExpressionParser.java:988)
    at org.springframework.expression.spel.standard.InternalSpelExpressionParser.eatDottedNode(InternalSpelExpressionParser.java:407)
    at org.springframework.expression.spel.standard.InternalSpelExpressionParser.maybeEatNode(InternalSpelExpressionParser.java:360)
    at org.springframework.expression.spel.standard.InternalSpelExpressionParser.eatPrimaryExpression(InternalSpelExpressionParser.java:345)
    at org.springframework.expression.spel.standard.InternalSpelExpressionParser.eatUnaryExpression(InternalSpelExpressionParser.java:337)

由于下面的 mongo 查询运行并返回所需的值,我相信,我只需要转义 /./ 字符,这样 SpEL 就不会尝试解析它。

    { 'user_id' : /./ } 

我找不到 SpEL 的转义字符,但尝试了以下选项,但仍然出现类似类型的解析异常:

你能帮帮我吗?

我成功了:

@Query("  ?#{ hasRole('ROLE_ADMIN') ? '{}' : {'user_id' :  principal.userId } } ")

也许你可以使用像

这样的转义函数
%?#{escape(...)}