【问题标题】:Escape MongoDB regex character in Spring SpEL - getting SpelParseException在 Spring SpEL 中转义 MongoDB 正则表达式字符 - 获取 SpelParseException
【发布时间】:2016-05-18 14:02:31
【问题描述】:

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

我的 BlogRepository 中有以下方法设置,它扩展了 MongoRepository:

@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 的转义字符,但使用了以下选项,但仍然会出现类似的解析异常:

  • '/./'
  • #{/./} -- 用 SpEL 表达式包装
  • .
  • /.*.*/

你能帮帮我吗?

【问题讨论】:

    标签: java spring mongodb spring-boot spring-el


    【解决方案1】:

    我搞定了:

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

    【讨论】:

      【解决方案2】:

      也许你可以使用转义函数

      %?#{escape(...)}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-05
        • 1970-01-01
        • 2010-12-22
        • 2010-09-21
        相关资源
        最近更新 更多