【问题标题】:Replace pieces of groovy code inside string by code execution result with java like in SoapUI像在 SoapUI 中一样,用 java 的代码执行结果替换字符串中的一些 groovy 代码
【发布时间】:2025-12-30 17:00:11
【问题描述】:

我想要发布的配置文件中有 xml 数据,我需要在这个 xml 中添加一些动态部分,例如 UUID、当前日期...

在 SoapUI 中,我可以像这样在 xml 中直接使用 Groovy 脚本:

<?xml version='1.0' encoding='utf-8'?>
<Envelope>
    <Body>
        <date>${=new java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX\).format(new Date())}</date>
        <uddi>${=java.util.UUID.randomUUID()}</uddi>
    <Body>
<Envelope>

我明白了

<?xml version='1.0' encoding='utf-8'?>
<Envelope>
    <Body>
        <date>2016-04-07T15:29:43.729+02:00</date>
        <uddi>5f8020d3-1fe0-4755-8056-cdef536c98b9</uddi>
    <Body>
<Envelope>

我尝试使用此代码,它适用于 UUID,但不适用于 SimpleDateFormat。

String sExecUUID = "\"UUID\" -> ${java.util.UUID.randomUUID()} !!!"; // OK : "UUID" -> 5f8020d3-1fe0-4755-8056-cdef536c98b9 !!!
String sExecDate = "\"Date\" -> ${new java.text.SimpleDateFormat(\"yyyy-MM-dd'T'HH:mm:ssXXX\").format(new Date())} !!!"; // KO

//String sExec = sExecUUID;
String sExec = sExecDate;
sExec = sExec.replace("\\","\\\\"); // Replace \ --> \\
sExec = sExec.replace("\n","\\n");  // Replace \n --> \\n
sExec = sExec.replace("\r","\\r");  // Replace \n --> \\n
sExec = sExec.replace("\"","\\\""); // Replace " --> \"
sExec = "println \""+sExec+"\"";

// call groovy expressions from Java code
GroovyShell shell = new GroovyShell();
Object value = shell.evaluate(sExec);
System.out.println(value);

日期的例外是:

org.codehaus.groovy.control.MultipleCompilationErrorsException: 启动失败:Script1.groovy:1:意外字符:'\'@ 第 1 行, 第 55 列。 ew java.text.SimpleDateFormat(\"yyyy-MM-

我知道这是由于我在 SimpleDateFormat 中的 \" 而不是 " 但我必须转义 " 才能使用 println

我怎样才能让它工作?

【问题讨论】:

    标签: java groovy


    【解决方案1】:

    Groovy 有一个名为 TemplateEngine 的接口,具有不同的实现,例如 SimpleTemplateEngine

    这个模板就是你所需要的:它们使用带有占位符的文本(${..} 或 jsp 语法 )。占位符可以包含任何 groovy 代码。

    来自官方文档:

    def binding = [
         firstname : "Grace",
         lastname  : "Hopper",
         accepted  : true,
         title     : 'Groovy for COBOL programmers'
     ]
     def engine = new groovy.text.SimpleTemplateEngine()
     def text = '''\
     Dear <%= firstname %> $lastname,
    
     We <% if (accepted) print 'are pleased' else print 'regret' %> \
     to inform you that your paper entitled
     '$title' was ${ accepted ? 'accepted' : 'rejected' }.
    
     The conference committee.
     '''
     def template = engine.createTemplate(text).make(binding)
     println template.toString()
    

    SimpleTemplateEngine

    【讨论】: