Как использовать XML (не URL) в качестве источника в JasperServer? - PullRequest
0 голосов
/ 15 октября 2018

Я пытаюсь использовать строку XML в качестве источника отчета, который публикуется в JasperServer.Прежде всего я использую Jasper 6.5.1 , и мое приложение JSF .

У меня есть отчет, который получает xPath в качестве источника, но единственныйя бы поработал так:

  • Я создаю веб-сервис, в котором я выбираю объект в базе данных (поле xml находится в этом объекте), поэтому я возвращаю Response.ok, и метод создаетXML.
  • Затем в вызове печати я создаю URL, указывающий на свой собственный WS, и передаю URL в качестве параметра net.sf.jasperreports.xml.source, но я думаю, что это запах кода, потому что в печативызывающий метод У меня уже есть сущность и строка XML, но мне нужно создать URL-адрес, отправляемый в отчет и отчет, и вызвать веб-службу, чтобы получить тот же XML, что и источник.

Это работает,но я думаю, что это запах кода.

Ссылка Remote XML DataSource

Так что теперь у меня похожая ситуация, но у меня еще нет сущности, поэтому яне могу использовать этот обходной путь, поэтому мне нужно передать XML в отчет как String, как Document, как 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, добавлю его и сохраню исключение яшмытеги.

Вот Снимок экрана моих параметров

Я пытаюсь отправить свою строку XML как InputStream следующим образом:

InputStream inputStream = new ByteArrayInputStream(nfe.getSisXml().getBytes(Charset.forName("UTF-8")));
parameters.put("XML_INPUT_STREAM", inputStream);

И я использую свой собственный клиент, где я конвертирую параметры с помощью Джексона в JSON перед отправкой отчета на сервер:

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));
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...