播放1.2.4:在模板中渲染XML

时间:2011-12-19 18:05:49

标签: java xml templates groovy playframework

我最近已升级到Play 1.2.4,我相信以下故障单的错误修复对我的部分代码产生了负面影响:

https://play.lighthouseapp.com/projects/57987/tickets/549-play-rest-xml-rendering-of-html-entities-issue

我相信上面实现的修复从XML字符串中逃脱了所有HTML实体 - 包括实际的XML结构本身。

因此<someXml/>变为&lt;someXml/&gt;

我遇到的问题是我使用模板将XML作为API调用提供服务,因此XML会返回给调用者进行转义,因此无用。

我尝试过使用:

#{verbatim} ${ anObject.someXml } #{/verbatim}

${ anObject.someXml.raw() } 

以原始格式获取XML,但这不起作用。

可以在groovy template __safeFaster方法(第400行)中找到导致此问题的代码部分。

有没有人知道我可以解决这个新功能的方法?

2 个答案:

答案 0 :(得分:2)

正如上面问题中所讨论的,问题的原因在于__safeFaster方法 - 或者更具体地说,是行:

if (template.name.endsWith(".xml"))
    return StringEscapeUtils.escapeXml(val.toString());

要解决此问题,我们会在相应控制器中将响应content-type设置为text/xml,并将模板扩展名更改为.txt

希望Play的开发人员能够在下一个版本中解决这个问题。

答案 1 :(得分:1)

如果您尝试渲染XML String,可以使用play.mvc.Controller中的renderXml方法在浏览器中显示格式化的XML。

我通过将此行添加到我的conf / routes文件中进行了测试:

# Render XML
GET    /renderXml    Application.renderXml(format:'xml')

然后在Application.java中创建此方法,该方法读取XML文件并呈现它(使用Guava I/O):

    public static void renderXml() throws FileNotFoundException, IOException {      
    File xmlFile = new File("app/models", "xmlFile.xml");
    InputSupplier<InputStreamReader> inReader = Files.newReaderSupplier(xmlFile, Charsets.UTF_8);
    List<String> lines = CharStreams.readLines(inReader);

    String outputXml = "";

    for (String line : lines) {
        outputXml += line;
    }

    renderXml(outputXml);
}

希望这有帮助!