【问题标题】:Using Groovy markupbuilder to build simple web page. No such DSL method 'body' found among steps使用 Groovy 标记构建器构建简单的网页。在步骤中找不到这样的 DSL 方法“主体”
【发布时间】:2021-05-03 17:28:51
【问题描述】:

我正在尝试使用 HTML 标记构建一个简单的网页,但出现错误:java.lang.NoSuchMethodError: No such DSL method 'body' found between steps

代码:

@NonCPS
def parseJsonForXml(inputJson) {
try {
    def writer = new StringWriter()
    def markup = new MarkupBuilder(writer)
    markup.html {
        body {
            div {
                h1 "Test Page"
            }
        }
    }

【问题讨论】:

  • 我不知道@NonCPS 有什么效果,但没有它,您在那里显示的代码似乎可以正常工作。这是否发生在 Jenkins 环境中?
  • 是的,这发生在 Jenkins 内部。我会尝试删除@NonCPS
  • 是的,这很奇怪。删除 @NonCPS 后我仍然遇到同样的问题
  • NonCPS 告诉 Jenkins 不要应用 CPS 转换,更多关于它们 - github.com/cloudbees/groovy-cps 在这种情况下,最好不要应用 CPS

标签: jenkins-groovy markupbuilder


【解决方案1】:

Jenkins 做了很多 Groovy 魔法,例如 CPS 转换、自定义方法拦截器等。 简而言之,嵌套关闭器不会在标记对象上调用,因为它们应该在 groovy 中,而是 Jenkins 更改接收器对象并在主脚本上调用它们,因此它检查主体 DSL 步骤是否在内部映射中定义Jenkins 和插件中定义的所有 DSL 方法。 为了让它工作改变,使调用者对象显式

import groovy.xml.MarkupBuilder

@NonCPS
def parseJsonForXml() {
    def writer = new StringWriter()
    def markup = new MarkupBuilder(writer)
    markup.with {
        html {
            body {
                div {
                    h1 "Test Page"
                }
            }
        }    
    }
    
    return writer.toString()
}
println(parseJsonForXml())

它完全按照你的期望去做

Running in Durability level: MAX_SURVIVABILITY
[Pipeline] Start of Pipeline
[Pipeline] echo
<html>
  <body>
    <div>
      <h1>Test Page</h1>
    </div>
  </body>
</html>
[Pipeline] End of Pipeline
Finished: SUCCESS

【讨论】:

  • 就是这样。谢谢!
猜你喜欢
  • 2018-11-11
  • 2018-01-24
  • 1970-01-01
  • 1970-01-01
  • 2018-05-13
  • 1970-01-01
  • 2021-02-28
  • 2018-09-17
  • 2021-03-04
相关资源
最近更新 更多