我最近已升级到Play 1.2.4,我相信以下故障单的错误修复对我的部分代码产生了负面影响:
我相信上面实现的修复从XML字符串中逃脱了所有HTML实体 - 包括实际的XML结构本身。
因此<someXml/>
变为<someXml/>
我遇到的问题是我使用模板将XML作为API调用提供服务,因此XML会返回给调用者进行转义,因此无用。
我尝试过使用:
#{verbatim} ${ anObject.someXml } #{/verbatim}
和
${ anObject.someXml.raw() }
以原始格式获取XML,但这不起作用。
可以在groovy template __safeFaster
方法(第400行)中找到导致此问题的代码部分。
有没有人知道我可以解决这个新功能的方法?
答案 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);
}
希望这有帮助!