我正在尝试使用XML字符串作为JasperServer中发布的报告的来源。首先,我使用的是 Jasper 6.5.1 ,我的应用程序是 JSF 。
我有一个接收xPath作为源的报告,但是我唯一的工作方式是:
它可以工作,但是我认为这是一种代码味道。
Reference Remote XML DataSource
所以现在我遇到类似的情况,但是我还没有实体,所以我无法使用该解决方法,因此我需要将XML作为字符串,文档,InputStream或其他形式传递给报表
但是没有用。有什么例子或方法可以做到吗?
我正在关注以下参数可能性:Jasper XML Constants
我正在尝试使用 XML_DATA_DOCUMENT 参数:
InputSource source = new InputSource(new StringReader(nfe.getSisXml()));
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse(source);
parameters.put("XML_DATA_DOCUMENT", document);
但是我得到了例外:
Infinite recursion (StackOverflowError) (through reference chain: org.apache.xerces.dom.DeferredDocumentImpl["firstChild"]->org.apache.xerces.dom.DeferredElementImpl["ownerDocument"]->org.apache.xerces.dom.DeferredDocumentImpl["firstChild"]->
预先感谢
编辑:在发表评论后,我尝试使用XML_INPUT_STREAM参数,这是我的JRXML的一部分:
<queryString language="xPath">
<![CDATA[//infNFe/det]]>
</queryString>
<field name="NfeId" class="java.lang.String">
<fieldDescription><![CDATA[/nfeProc/NFe/infNFe/@Id]]></fieldDescription>
</field>
<field name="NfeVersao" class="java.lang.String">
<fieldDescription><![CDATA[/nfeProc/NFe/infNFe/@versao]]></fieldDescription>
</field>
XML_INPUT_STREAM参数没有出现在JRXML中,如果我编辑JRXML并添加它并保存jasper,则排除标记。
这里是Screenshot of my parameters
我试图像这样将XML字符串作为InputStream发送:
InputStream inputStream = new ByteArrayInputStream(nfe.getSisXml().getBytes(Charset.forName("UTF-8")));
parameters.put("XML_INPUT_STREAM", inputStream);
我正在使用自己的客户端,在此之前我使用JSON在Jackson中转换参数,然后再发送到服务器中的报告:
final ObjectNode requestNode = JsonNodeFactory.instance.objectNode()
.put("reportUnitUri", path)
.put("async", false)
.put("freshData", false)
.put("saveDataSnapshot", false)
.put("outputFormat", "pdf")
.put("ignorePagination", false);
//.put("pages", "0");
if (parameters != null && !parameters.isEmpty()) {
final ArrayNode parametersNode = requestNode.putObject("parameters").putArray("reportParameter");
for (Map.Entry<String, Object> e : parameters.entrySet()) {
final ObjectNode parameterNode = parametersNode.addObject()
.put("name", e.getKey());
if (e.getValue() instanceof String) {
parameterNode.putArray("value").add((String) e.getValue());
} else {
parameterNode.putArray("value").add("" + new ObjectMapper().convertValue(e.getValue(), JsonNode.class));
}
}
}