Я пытаюсь использовать строку 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));
}
}
}