逃避Spring SpEL中的MongoDB正则表达式字符 - 获取SpelParseException

时间:2016-05-18 14:02:32

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

我正在尝试覆盖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表达式进行包装
  • .
  • /.*.*/
你可以帮帮我吗?

2 个答案:

答案 0 :(得分:1)

我得到了它的工作:

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

答案 1 :(得分:0)

可能您可以使用类似的转义功能

%?#{escape(...)}