【问题标题】:How to create GString from String without "${str}" in Groovy如何在 Groovy 中从没有“${str}”的字符串创建 GString
【发布时间】:2015-02-18 14:39:12
【问题描述】:

我有来自 Java 的 String 变量(例如,str),它存储了一些 GString 表达式,比如说 "SELECT ${path} path FROM dual",它绝对是来自用户输入的动态字符串,我不知道,如何许多${}会在那里。

我不想在sql.rows() 中使用它,并通过使用PreparedStatement 的当前绑定评估${path}

问题是:

  1. 如果我不以某种方式将str 转换为GString,它将抛出SQLException,因为没有PreparedStatement,我们需要在'${path}' 周围使用引号。但它不安全,而且 Groovy 会生成警告(我们应该使用 PreparedStatement 并删除引号)。
  2. 如果我将str 转换为GString 这种方式:sql.rows("${str}"),那么Groovy 将使用完全错误的准备语句,其中只包含"?",当然,它不会工作,我需要语句:@ 987654340@.

问题是我们如何在不使用"${}" 包装的情况下从String 获得GString?或者我们如何仅评估GString 的第一级(仅str,而不是path)?或者我该如何以其他方式解决这个问题?

谢谢。

【问题讨论】:

  • 这里有很多例子:jira.codehaus.org/browse/GROOVY-2505;但一定要清理查询,否则你会得到一些 SQL 注入
  • @cfrick,这个(不是评估)示例在我的情况下不起作用,它至少违反了我的“问题”中的一点。 eval 示例不起作用,因为我的字符串有 ',' 字符并且 eval 抛出异常。
  • 您能否举一个无法评估的字符串示例以及最终的 GString 应该是什么样子?
  • @blackdrag,无法评估:"SELECT '123' test\n, ${path} path FROM dual",最终的 GString 应该看起来像:"SELECT '123' test\n, ${path} path FROM dual"(就像字符串一样,我需要在不做任何更改的情况下转换它,以便在 sql.rows 中使用(当然没有评估${path},因为我需要使用自动sql.rows准备好的语句机制)。
  • 以及为什么 def gstring = Eval.me(/"str"/) 不起作用?,除非您直接评估,否则我认为逗号不会导致问题。但这将是 Eval.me(str) 然后

标签: java string groovy gstring


【解决方案1】:

根据信息我建议以下半解决方案:

def gsring = Eval.me('"'+str.replaceAll("\"","\\"")+'"')

它将用转义的引号替换所有双引号,然后将整个内容评估为 GString。只要值部分中没有使用双引号,这应该可以工作。然后可以将gstring用于Sql。该解决方案与 GROOVY-2505 中的前两个评估示例基本相同。 marshall 遗漏的重要一点显然是我们需要将字符串内容用引号括起来。 /"str"/ 当然只会产生一个字符串 "str"。如果 str 是例如 SELECT,那么这将产生“str”。我们想要的是'"'+str+'"',它会给出“SELECT”。它必须是双引号,因为我们希望 Eval 调用来评估 gstring 部分,这在单引号字符串中不可用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    • 2012-07-14
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多