2012-01-09 14 views
8

Sto lavorando a un progetto che mira a sostituire il nostro generatore di PDF corrente con JasperReports Server. Il piano è utilizzare l'API REST/HTTP per raggiungere un alto livello di astrazione tra i sistemi.Passaggio del contenuto durante la generazione del report JasperServer utilizzando l'API REST

In modo ottimale, non vogliamo consentire a JasperReports Server di estrarre i dati dal database, poiché ciò ignorerebbe la registrazione e l'autorizzazione esistenti nell'architettura dell'applicazione chiamante. Invece, vorremmo iniziare con l'estrazione del contenuto nell'applicazione chiamante, e poi passare quel contenuto a JasperReports Server.

Abbiamo fatto un bel po 'di ricerche e la mancanza di risultati rilevanti indica che questo non è il modo in cui solitamente si usa JasperReports Server. I parametri di input nei tutorial che abbiamo trovato sono in genere valori scalari (interi, booleani o stringhe) e non strutture o oggetti complessi. Inoltre, sembra che più o meno ogni campione presuppone che si desidera consentire a JasperReports Server di connettersi a un database.

Se è possibile passare in strutture complesse (come una serie di mappe, dove alcuni elementi della mappa sono matrici o mappe stesse), qual è la migliore pratica per farlo? Non ho idea di come una tale struttura debba essere formattata nel corpo della richiesta. L'API SOAP è più adatta?

Se ciò non è affatto come si dovrebbe progettare una soluzione JasperReports Server, quali prodotti/soluzioni alternative sono più adatti?

Grazie in anticipo per qualsiasi input.

+0

È possibile utilizzare l'operatore 'get' per ottenere il file modello del report (JRXML). Successivamente è possibile passare al report tutto ciò che si desidera (con l'aiuto dell'API JasperReports). Ad esempio, puoi passare Bean come origine dati o passare Map come parametro. –

+0

Grazie per la risposta, Alex. Come ho appena scritto qui sotto, ho deciso di seguire un altro approccio. Indipendentemente da ciò, non sono sicuro di vedere il punto nel recupero del JRXML usando l'API HTTP ... – MaxH

risposta

7

Dopo diverse ore trascorse in ricerca, penso di essere pronto a rispondere alla mia stessa domanda.

JasperReports Server ("JRS" di seguito) è fondamentalmente progettato per recuperare i dati da solo. Anche se sarebbe possibile forzare il JRS ad alimentare i dati, ho deciso di non farlo.

Uno degli svantaggi più ovvi di non consentire a JRS di recuperare i dati stessi è che non sarebbe più possibile generare report dall'interfaccia web JRS. Anche l'integrazione da altri sistemi diventa impossibile o difficile se l'applicazione client è responsabile della fornitura dei dati in un formato predefinito.

Nel progetto su cui sto lavorando, abbiamo deciso di creare un DataSource JRS personalizzato basato su DataSource XML remoto, che richiama l'API XML dell'applicazione client. In altre parole, l'applicazione client richiede un report da JRS e JRS richiede quindi i dati dall'applicazione client. L'API XML dovrà essere estesa per coprire tutte le nostre esigenze di reporting, ma questa è una buona cosa secondo me. Una buona copertura API sarà utile in futuro.

Spero che questi pensieri aiutino qualcuno a fare domande simili.

+0

Buona risposta. Avendo risposto alla tua stessa domanda, potresti - ma non è necessario - accettare la tua risposta. Dovresti accettare il tuo. – mdahlman

0

Come hai scritto, il recupero dei dati è un modo più naturale per il JRS. Tuttavia, avevo bisogno di andare nella direzione opposta - I dati POST per segnalare seduto nel repository JRS tramite una chiamata REST.

Ho passato i dati XML nel mio parametro "xmlDocument" e, tramite un "trucco", un report eseguito può utilizzare questo XML per ulteriori query X-path.

xmlDocument è solo una semplice stringa:

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

In fase di progettazione Creo adattatore di dati XML con file XML che uso per l'anteprima. Si noti che un nuovo parametro XML_INPUT_STREAM è apparso dopo aver scelto l'adattatore XML.

Quindi pubblico il rapporto al JRS. Durante l'esecuzione report, quando il report non è collegato a qualsiasi fonte di dati, si legge il parametro XML_INPUT_STREAM invece (come fonte di dati di ripiego), che appare come segue:

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

Avvolgo stringa "xmlDocument" per InputStream.