2012-01-09 16 views
8

私は現在のPDFジェネレータをJasperReports Serverに置き換えることを目指すプロジェクトに取り組んでいます。計画は、REST/HTTP APIを使用してシステム間の抽象度を高めます。REST APIを使用してJasperServerレポートを生成する際にコンテンツを渡す

最適なのは、JasperReports Serverがデータベースからデータをプルすることは望ましくありません。これは、呼び出し側アプリケーションのアーキテクチャで既存のロギングと認可をバイパスするためです。代わりに、呼び出し側のアプリケーションでコンテンツを抽出してから、そのコンテンツをJasperReports Serverに渡したいと考えています。

私たちはかなりの調査を行いました。関連する結果がないことは、これが典型的にJasperReports Serverを使用する方法ではないことを示しています。私たちが見つけたチュートリアルの入力パラメータは、通常はスカラー値(整数、ブール値または文字列)であり、複雑な構造やオブジェクトではありません。さらに、サンプルごとに、JasperReportsサーバーがデータベースに接続できるようにすることを想定しているようです。

複雑な構造(マップの配列など、いくつかのマップ要素が配列またはマップである場合)を渡すことができる場合は、これを行うためのベストプラクティスは何ですか?どのようにそのような構造体をリクエストボディにフォーマットするべきか分かりません。 SOAP APIはより適していますか?

JasperReports Serverソリューションを設計する方法がまったくない場合、どのような代替製品/ソリューションが適していますか?

事前にお問い合わせいただきありがとうございます。

+0

レポートのテンプレート(JRXML)ファイルを取得するために 'get'演算子を使用できます。その後、必要なものすべてをレポートに渡すことができます(JasperReports APIの助けを借りて)。たとえば、Beanをデータソースとして渡すことも、Mapをパラメータとして渡すこともできます。 –

+0

あなたの答えはありがとうございます。私が下に書いたように、私は別のアプローチをとることに決めました。 HTTP APIを使用してJRXMLをフェッチする際のポイントがわかりません。 – MaxH

答えて

7

研究に数時間を費やした後、私は自分の質問に答える準備ができていると思う。

JasperReports Server(以下「JRS」)は、基本的にデータを単独で取得するように設計されています。データをフィードJRSに強制することは可能ですが、私はそうしないことに決めました。

JRSがデータ自体をフェッチしないようにする最も明白な欠点の1つは、もはやJRS Webインターフェイスからレポートを生成できないということです。クライアントアプリケーションがデータを所定の形式で供給することに責任がある場合、他のシステムからの統合も不可能または困難になります。

私が進めているプロジェクトでは、クライアントアプリケーションのXML APIを呼び出すRemote XML DataSourceに基づいてカスタムJRS DataSourceを構築することにしました。つまり、クライアントアプリケーションはJRSからのレポートを要求し、JRSはそのデータをクライアントアプリケーションから要求します。 XML APIは、すべてのレポートのニーズをカバーするために拡張する必要がありますが、それは私の意見では良いことです。将来的には、優れたAPIカバレッジが役立ちます。

これらの考えが同様の質問をしている人に役立つことを願っています。

+0

良い答え。あなた自身の質問に答えているかもしれませんが、答えを受け入れる必要はありません。あなたはあなたを受け入れるべきです。 – mdahlman

0

あなたが書いたように、データを取得するのがJRSにとってより自然な方法です。しかし、私は逆の方法をとる必要がありました - 私はREST呼び出しを介してJRSレポに座っていることを報告するPOSTデータを送りました。

私はパラメータ "xmlDocument"でXMLデータを渡し、 "トリック"によって、実行されたレポートはこのXMLをさらなるXパスクエリに使用できます。私はプレビューに使用するXMLファイルを使用してXMLデータアダプタを作成

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

設計フェーズで:

のXmlDocumentは、単純な文字列です。 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> 

私はのInputStreamに対して「常にXmlDocument」の文字列を折り返します。

関連する問題