Groovy在java注释中插入多行字符串

K2m*_*J33 2 java groovy jvm compiler-errors spock

是否可以编译带有常量 @Sql 注释的常规代码?

下面的代码是简单的测试,用 Spock 编写。

@Sql(statements = ["""
         INSERT INTO pracownik ($Fields.KOMPETENCJA_ID, nr_ewid) 
                                values (1, 'A');
         INSERT INTO typ_zadania (id, kod) values (1, 'KOD');
"""]
)
def "should add new qualification"() { 
  //test code omitted
}
Run Code Online (Sandbox Code Playgroud)

当我想运行测试方法时,我在编译时收到错误:

Groovyc:预期 ' INSERT INTO pracownik ($Fields.KOMPETENCJA_ID, nr_ewid) 值 (1, 'A'); INSERT INTOtyp_zadania(id,kod)值(1,'KOD'); 成为 @org.springframework.test.context.jdbc.Sql 中 java.lang.String 类型的内联常量`

我认为带美元符号的多行字符串被评估为 GString 对象,但语句字段是字符串数组的类型。

我可以在groovy代码中使用多行字符串中的java注释常量吗?

Szy*_*iak 5

您面临的问题与多行字符串无关 - 编译器期望传递给statement属性的值是内联常量。GString插值变量不能满足此期望。GString如果您编写包含来自类字段的内插值的单行,您将看到完全相同的编译错误Fields

看来您的意图是获取与 关联的列名称Fields.KOMPETENCJA_ID。将其替换为期望值,因此不需要插值。像这样的东西:

@Sql(statements = """
        INSERT INTO pracownik (kompetencja_id, nr_ewid) 
                               values (1, 'A');
        INSERT INTO typ_zadania (id, kod) values (1, 'KOD');
""")
def "should add new qualification"() {
    //test code omitted
}
Run Code Online (Sandbox Code Playgroud)

关于 Groovy 的一个有趣的事实。双引号"通常用来表示GString类型。然而,Groovy 编译器会检查字符串是否包含任何变量,例如${variableName}进行插值。如果找到,则将其用作GString类型,String否则使用。