2012-01-09 3 views
8

Я работаю над проектом, целью которого является замена нашего текущего генератора PDF на JasperReports Server. Планируется использовать API REST/HTTP для достижения высокого уровня абстракции между системами.Передача содержимого при генерации отчета JasperServer с использованием API REST

Оптимально мы не хотим, чтобы JasperReports Server извлекал данные из базы данных, поскольку это обойдется существующим протоколированием и авторизацией в архитектуре вызывающего приложения. Вместо этого мы хотели бы начать с извлечения содержимого в вызывающем приложении, а затем передать этот контент на сервер JasperReports.

Мы провели довольно много исследований, и отсутствие соответствующих результатов указывает, что это не так, как вы обычно используете JasperReports Server. Входные параметры в найденных нами учебниках обычно представляют собой скалярные значения (целые числа, булевы или строки), а не сложные структуры или объекты. Более того, кажется, что более или менее каждый пример предполагает, что вы хотите, чтобы сервер JasperReports подключался к базе данных.

Если возможно передать сложные структуры (например, массив карт, где некоторые элементы карты являются массивами или самими картами), что лучше всего подходит для этого? Я не знаю, как такая структура должна быть отформатирована в теле запроса. Является ли SOAP API лучше подходит?

Если это совсем не то, как вы должны проектировать решение JasperReports Server, какие альтернативные продукты/решения более подходят?

Заранее благодарим за любой ввод.

+0

Вы можете использовать оператор 'get' для получения файла шаблона отчета (JRXML). После этого вы можете передать отчет всем, что хотите (с помощью JasperReports API). Например, вы можете передать Bean в качестве источника данных или передать Map как параметр. –

+0

Спасибо за ваш ответ Алекс. Как я только что написал ниже, я решил пойти с другим подходом. Несмотря ни на что, я не уверен, что вижу смысл в получении JRXML с помощью HTTP API ... – MaxH

ответ

7

После нескольких часов, потраченных на исследования, я думаю, что готов ответить на мой собственный вопрос.

Сервер JasperReports (далее «JRS») в основном предназначен для получения данных сам по себе. Хотя было бы возможно заставить JRS с данными, я решил не делать этого.

Одним из наиболее очевидных недостатков, заключающихся в том, что JRS не позволяет получить данные, является то, что уже невозможно будет создавать отчеты с веб-интерфейса JRS. Интеграция с другими системами также становится невозможной или сложной, если клиентское приложение отвечает за предоставление данных в предопределенном формате.

В проекте, над которым я работаю, мы решили создать пользовательский источник данных JRS на основе удаленного XML DataSource, который вызывает XML-интерфейс клиентского приложения. Другими словами, клиентское приложение запрашивает отчет от JRS, а JRS затем запрашивает его данные из клиентского приложения. XML API нужно будет расширить, чтобы охватить все наши потребности в отчетности, но, на мой взгляд, это хорошо. Хорошее покрытие API пригодится в будущем.

Надеюсь, эти мысли помогут кому-то схожими вопросами.

+0

Хороший ответ. Отвечая на ваш собственный вопрос, вы можете, но вам не нужно принимать ваш ответ. Вы должны принять ваше. – mdahlman

0

Как вы писали, получение данных более естественным способом для JRS. Тем не менее, мне нужно было сделать обратный путь - данные POST сообщают о сидении в репозитории JRS через звонок REST.

Я передаю XML-данные в моем параметре «xmlDocument» и, используя «трюк», выполненный отчет может использовать этот XML для дальнейших запросов X-пути.

XMLDOCUMENT это простая строка:

<parameter name="xmlDocument" class="java.lang.String"> 
    <defaultValueExpression><![CDATA["<?xml version=\"1.0\" encoding=\"UTF-8\"?><documentData></documentData>"]]></defaultValueExpression> 
</parameter> 

При проектировании фазы создать адаптер данных XML с файлом XML, который я использую для просмотра. Обратите внимание, что после выбора XML-адаптера появился новый параметр XML_INPUT_STREAM.

Затем я публикую отчет для JRS. Во время выполнения отчета, когда отчет не связан с любым источником данных, считывает параметр XML_INPUT_STREAM вместо (как резервного источника данных), который выглядит следующим образом:

<parameter name="XML_INPUT_STREAM" class="java.io.InputStream" isForPrompting="false"> 
    <defaultValueExpression><![CDATA[new java.io.ByteArrayInputStream($P{xmlDocument}.getBytes("UTF-8"))]]></defaultValueExpression> 
</parameter> 

Я обернуть «XMLDOCUMENT» строку InputStream.

Смежные вопросы