【问题标题】:Groovy's MarkupBuilder exception on generating "id" XML tagGroovy 在生成“id”XML 标记时的 MarkupBuilder 异常
【发布时间】:2012-12-26 09:51:51
【问题描述】:

我正在尝试构建 XML 提要,而 Groovy 的 MarkupBuilder 让我很头疼:

 def newsstandFeed(def id) {
    def publication = Publication.get(id)
    def issues = issueService.getActiveIssuesForPublication(publication)
    def updateDate = DateUtil.getRFC3339DateString(publication.lastIssueUpdate)

    def writer = new StringWriter()
    writer.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
    def xml = new MarkupBuilder(writer)
    xml.feed('xmlns':"http://www.w3.org/2005/Atom", 'xmlns:news':"http://itunes.apple.com/2011/Newsstand") {
        updated("${updateDate}")
        issues.each { issue ->
            entry {
                id (issue.id)
                updated("${DateUtil.getRFC3339DateString(issue.lastUpdated)}")
                published("${DateUtil.getRFC3339DateString(issue.releaseDate)}")
                summary(issue.summary)
                "news:cover_art_icons" {
                    "news:cover_art_icon" (size:"SOURCE", src:"${issue.cover.remotePath}")
                }
            }
        }
    }

    return writer.toString()
}

我得到了这个例外:

Class groovy.lang.MissingMethodException 
No signature of method: java.lang.String.call() is applicable for argument types: (org.codehaus.groovy.runtime.GStringImpl) values: [CYB_001] Possible solutions: wait(), any(), wait(long), any(groovy.lang.Closure), take(int), each(groovy.lang.Closure)

“CYB_001”是第一个“id”属性。

如果我将“id”重命名为“ids”或其他任何名称,它会起作用,并返回正确的 XML 文档:

            ....
            issues.each { issue ->
            entry {
                ids ("${issue.id}")
                ...

任何想法为什么会发生这种情况,以及如何解决这个问题?

环境是 Grails 2.1.1(我假设是 Groovy 1.8)

【问题讨论】:

  • 删除引号不起作用,顺便说一句:id (issue.id) - 相同的异常
  • 你为什么不直接使用 feed 插件呢? grails.org/Feeds+Plugin
  • 这段代码之前是什么?你能发布整个方法块吗?
  • 好点。事实上,我已经将它用于一些 RSS 提要(相同的内容,只是不同的格式),但我很难让它输出符合 Apple 规范 itunesconnect.apple.com/docs/NewsstandAtomFeedSpecification.pdf 的原子提要
  • Will P - 谢谢!实际上,我有一个局部变量 id - 如果我重命名它,它可以工作,呵呵。 ;-)(将您的评论放在答案中,我会接受)。

标签: java xml grails groovy markupbuilder


【解决方案1】:

遇到同样的情况,然后建造师为我解决了这个问题。

def writer = new StringWriter()
    def builder = new MarkupBuilder(writer)
    builder.executions() {
        project.scalaVersions.each { scalaVersion ->
            def scalaMajorVer = '_' + scalaVersion.split('\\.')[0..1].join('.')
            def artifactIdStr = publication.artifactId.replaceAll(/_[0-9.]+$/, '') + scalaMajorVer

            execution() {
                builder.id(artifactIdStr) // qualify with builder to avoid collision
                phase('deploy')
                goals() { goal('deploy-file') }
                configuration() {
                    groupId(publication.groupId)
                    artifactId(artifactIdStr)
                    builder.version(project.version) // ditto.
                }
            }
        }
    }

【讨论】:

    【解决方案2】:

    在我看来,您的 XML 构建器正在尝试引用环境中的一些 String 变量。由于 groovy 构建器拦截丢失的方法调用,如果他们找到一个引用,他们将尝试应用它。以下代码可以重现您的错误:

    def id = ""
    
    new groovy.xml.MarkupBuilder().xml {
      id "90"
    }
    

    以下是可以的:

    def ids = ""
    
    new groovy.xml.MarkupBuilder().xml {
      id "90"
    }
    

    重命名您的 id 变量应该可以解决问题


    更新:

    在作用域中使用与变量同名的标签的另一种方法是使用(丑陋的)GString:

    def id = ""
    
    new groovy.xml.MarkupBuilder().xml {
      "${'id'}" "90"
    }
    

    【讨论】:

    • 很高兴我找到了这个答案 - 遇到了同样的事情。在我的例子中,我有一个参数(“用户名”)用于构建与标记(“用户名”)相同的 XML 的方法。将我的参数更改为“usernameParam”修复了它。
    • 请注意,即使您有 def id = "" new groovy.xml.MarkupBuilder().xml { "id" "90" } 它仍然会发生冲突。我发现这个使用 JsonBuilder 而不是 MarkupBuilder
    猜你喜欢
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    相关资源
    最近更新 更多