如何在JasperServer中使用XML(不是URL)作为源?

时间:2018-10-15 15:33:07

标签: java xml jasper-reports

我正在尝试使用XML字符串作为JasperServer中发布的报告的来源。首先,我使用的是 Jasper 6.5.1 ,我的应用程序是 JSF

我有一个接收xPath作为源的报告,但是我唯一的工作方式是:

  • 我创建一个Web服务,在其中选择数据库中的实体(xml字段位于该实体中),因此我返回Response.ok并生成XML。
  • 然后在打印调用中,我创建指向我自己的WS的URL,并将该URL作为参数net.sf.jasperreports.xml.source传递,但是我认为这是一种代码味道,因为在打印调用方法中我已经拥有实体和XML字符串,但是我需要构建一个发送到报表的URL,然后报表调用Web服务以获取与源相同的XML。

它可以工作,但是我认为这是一种代码味道。

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));
            }
        }
    }

0 个答案:

没有答案