2

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だと思います)

4

2 に答える 2

3

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"
}
于 2013-01-11T19:01:49.693 に答える