2012-01-09 28 views
8

Pracuję nad projektem, którego celem jest zastąpienie naszego obecnego generatora PDF serwerem JasperReports. Plan zakłada użycie interfejsu API REST/HTTP w celu osiągnięcia wysokiego poziomu abstrakcji między systemami.Przekazywanie treści podczas generowania raportu JasperServer za pomocą interfejsu API REST

Optymalnie, nie chcemy pozwolić JasperReports Server wyciągnąć dane z bazy danych, ponieważ byłoby to ominąć istniejące logowania i autoryzacji w architekturze aplikacji wywołującego. Zamiast tego chcielibyśmy rozpocząć od wyodrębnienia treści w aplikacji wywołującej, a następnie przekazać tę zawartość do serwera JasperReports.

Zrobiliśmy sporo dochodzenie, a brak odpowiednich wyników wskazuje, że nie jest jak zwykle użyć JasperReports Server. Parametry wejściowe w tutorialach, które znaleźliśmy, są zazwyczaj wartościami skalarnymi (liczbami całkowitymi, boolami lub łańcuchami), a nie złożonymi strukturami lub obiektami. Co więcej, wydaje się, że mniej więcej każda próbka zakłada, że ​​chcesz, aby serwer JasperReports łączył się z bazą danych.

Jeśli jest to możliwe, aby przejść w złożonych struktur (takich jak tablica mapy, gdzie niektóre elementy mapie tablice lub mapuje się), co jest najlepsze praktyki dla tej operacji? Nie mam pojęcia, jak taka struktura powinna być sformatowana w treści żądania. Czy interfejs API SOAP jest lepiej dopasowany?

Jeśli nie jest to w ogóle jak należy zaprojektować rozwiązanie serwerowe JasperReports, jakie alternatywne produkty/rozwiązania są bardziej odpowiednie?

Z góry dziękuję za wszelkie dane wejściowe.

+0

Możesz użyć operatora 'get' do pobrania pliku szablonu raportu (JRXML). Następnie możesz przekazać do raportu wszystko, co chcesz (za pomocą API JasperReports). Na przykład możesz przekazać komponent Bean jako źródło danych lub przekazać Map jako parametr. –

+0

Dzięki za odpowiedź Alex. Jak napisałem poniżej, postanowiłem zastosować inne podejście. Niezależnie od tego, nie jestem pewien, widzę, punkt, w celu pobrania JRXML za pomocą interfejsu API HTTP ... – MaxH

Odpowiedz

7

Po kilku godzinach spędzonych na badaniach myślę, że jestem gotów odpowiedzieć na moje własne pytanie.

JasperReports serwera („JRS” poniżej) są zasadniczo zaprojektowane, aby pobrać dane sama. Chociaż możliwe byłoby wymuszenie przekazywania JRS z danymi, postanowiłem tego nie robić.

Jednym z najbardziej oczywistych zwrotu nie pozwalając JRS przynieść same dane jest, że nie będzie już możliwe generowanie raportów za pomocą interfejsu WWW JRS. Integracja z innymi systemami staje się również niemożliwa lub trudna, jeśli aplikacja klienta jest odpowiedzialna za dostarczanie danych w predefiniowanym formacie.

W projekcie, nad którym pracuję, zdecydowaliśmy się zbudować niestandardowe źródło danych JRS w oparciu o zdalny XML DataSource, który wywołuje interfejs XML API aplikacji klienta. Innymi słowy, aplikacja kliencka żąda raportu od JRS, a JRS następnie żąda danych z aplikacji klienckiej. Interfejs API XML będzie musiał zostać rozszerzony, aby pokryć wszystkie nasze potrzeby związane z raportowaniem, ale jest to w moim przekonaniu dobre. Dobry zasięg API będzie przydatny w przyszłości.

Mam nadzieję, że te myśli pomogą komuś, kto ma podobne pytania.

+0

Dobra odpowiedź. Po udzieleniu odpowiedzi na własne pytanie możesz - ale nie musisz - przyjąć twojej odpowiedzi. Powinieneś zaakceptować swoją. – mdahlman

0

Jak pisałeś, pobieranie danych jest bardziej naturalne dla JRS. Jednak musiałem pójść w odwrotną stronę - I POST dane do zgłaszania siedzenie w JRS repo poprzez wywołanie REST.

Przepuszczam dane XML w moim parametrze "xmlDocument" i za pomocą "sztuczki", wykonany raport może wykorzystywać ten XML do dalszych zapytań X-path.

xmlDocument jest tylko prosty String:

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

W fazie projektowania tworzę adapter danych XML z pliku XML, który używam do podglądu. Zauważ, że po wybraniu adaptera XML pojawił się nowy parametr XML_INPUT_STREAM.

Następnie publikuję raport do JRS. Podczas wykonywania raportu, gdy raport nie jest związana z dowolnego źródła danych, odczytuje parametr XML_INPUT_STREAM zamiast (jako awaryjne źródło danych), który wygląda następująco:

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

ja owinąć „xmlDocument” ciąg na InputStream.