BIRT izvještavanje s Spring Bootom

1. Uvod

U ovom uputstvu integrirat ćemo BIRT (alati za poslovnu inteligenciju i izvještavanje) s Spring Boot MVC, kako bi posluživali statička i dinamička izvješća u HTML i PDF formatu.

2. Što je BIRT?

BIRT je mehanizam otvorenog koda za stvaranje vizualizacija podataka koji se mogu integrirati u Java web programe.

Riječ je o softverskom projektu najviše razine u okviru Eclipse Foundation koji koristi doprinose IBM-a i Innovent Solutions. Pokrenuo ga je i sponzorirao Actuate krajem 2004. godine.

Okvir omogućuje stvaranje izvješća integriranih sa širokim rasponom izvora podataka.

3. Ovisnosti Mavena

BIRT ima dvije glavne komponente: vizualni dizajner izvještaja za stvaranje datoteka za dizajn izvještaja i komponentu izvođenja za tumačenje i prikazivanje tih dizajna.

U našem primjeru web aplikacije koristit ćemo oboje na vrhu Spring Boot-a.

3.1. Ovisnosti Okvira BIRT

Kako smo navikli razmišljati u smislu upravljanja ovisnošću, prvi izbor bio bi potražiti BIRT u Maven Central.

Međutim, najnovija službena verzija dostupne osnovne knjižnice je 4.6 od 2016, dok na stranici za preuzimanje Eclipse možemo pronaći veze za najmanje dvije novije verzije (struja je 4,8).

Ako se odlučimo za službenu izgradnju, najlakši način da se kôd pokrene je preuzimanje BIRT Report Engine paketa, koji je cjelovita web aplikacija također korisna za učenje. Zatim moramo kopirati njegov lib mapu u naš projekt (veličine oko 68 MB) i recite IDE-u da uključi sve staklenke u nju.

Podrazumijeva se da, koristeći ovaj pristup, moći ćemo kompajlirati samo putem IDE-a, jer Maven neće pronaći te staklenke ako ih ručno ne konfiguriramo i ne instaliramo (više od 100 datoteka!) u naš lokalni repo.

Srećom, Innovent Solutions odlučio je uzeti stvar u svoje ruke i objavio na Maven Central svoje vlastite gradnje najnovijih BIRT ovisnosti, što je sjajno, jer nam upravlja svim potrebnim ovisnostima.

Čitajući komentare na internetskim forumima, nejasno je jesu li ti artefakti spremni za proizvodnju, ali Innovent Solutions od početka je radio na projektu pored tima Eclipse, pa se naš projekt oslanja na njih.

Uključivanje BIRT-a sada je vrlo jednostavno:

 com.innoventsolutions.birt.runtime org.eclipse.birt.runtime_4.8.0-20180626 4.8.0 

3.2. Ovisnosti proljetnog pokretanja

Sad kad je BIRT uvezen u naš projekt, samo trebamo dodati standardne ovisnosti Spring Boot-a u našu pom datoteku.

Ipak postoji jedna zamka jer BIRT jar sadrži vlastitu implementaciju Slf4J, što se ne igra lijepo Povratna informacija i baca iznimku sukoba tijekom pokretanja.

Kako ga ne možemo ukloniti iz staklenke, kako bismo riješili taj problem, moramo izuzeti Logback:

 org.springframework.boot spring-boot-starter-logging ch.qos.logback logback-classic 

Sad smo napokon spremni za početak!

4. BIRT izvješća

U okviru BIRT-a, izvješće je duga XML konfiguracijska datoteka, identificirano produženjem rptdesign.

Govori motoru što i gdje crtati, od stila naslova do potrebnih svojstava za povezivanje s izvorom podataka.

Za osnovno dinamičko izvješće moramo konfigurirati tri stvari:

  1. izvor podataka (u našem primjeru koristimo lokalnu CSV datoteku, ali to bi lako mogla biti tablica baze podataka)
  2. elementi koje želimo prikazati (grafikoni, tablice itd.)
  3. dizajn stranice

Izvješće je strukturirano poput HTML stranice, sa zaglavljem, tijelom, podnožjem, skriptama i stilovima.

Okvir nudi opsežni skup komponenata koje možete izabrati odmah iz kutije, uključujući integraciju u glavne izvore podataka, izglede, grafikone i tablice. A, možemo ga proširiti i dodati svoje!

Postoje dva načina za generiranje datoteke izvještaja: vizualni ili programski.

5. Dizajner izvještaja Eclipse

Da biste olakšali izradu izvještaja, tim Eclipse izradio je alat za dizajn izvještaja dodatak za svoj popularni IDE.

Ovaj alat ima jednostavno povlačenje i ispuštanje sučelja od Paleta s lijeve strane, što automatski otvara prozor za postavljanje nove komponente koju dodamo na stranicu. Također možemo vidjeti sve prilagodbe dostupne za svaku komponentu klikom na nju, a zatim na Urednik svojstva tipka (označena na donjoj slici).

Da bismo vizualizirali cijelu strukturu stranice u prikazu stabla, samo moramo kliknuti na Obris dugme.

The Istraživač podataka Kartica također sadrži izvore podataka definirane za naše izvješće:

Uzorak izvješća prikazan na slici nalazi se na putu /reports/csv_data_report.rptdesign

Još jedna prednost odabira vizualnog dizajnera je internetska dokumentacija koja se više usredotočuje na ovaj alat umjesto na programski pristup.

Ako već koristimo Eclipse, samo trebamo instalirati dodatak BIRT Report Design, koji uključuje unaprijed definiranu perspektivu i vizualni urednik.

Za one programere koji trenutno ne koriste Eclipse i ne želim se prebaciti, postoji paket Eclipse Report Designer, koji se sastoji od prijenosne instalacije Eclipse s unaprijed instaliranim dodatkom BIRT.

Jednom kada datoteka izvještaja bude finalizirana, možemo je spremiti u naš projekt i vratiti se kodiranju u željenom okruženju.

6. Programski pristup

Možemo i mi dizajnirati izvještaj koristeći samo kod, ali ovaj je pristup puno teži zbog loše dostupne dokumentacije, zato budite spremni kopati po izvornom kodu i mrežnim forumima.

Također vrijedi uzeti u obzir da je sve zamorni detalji dizajna poput veličine, duljine i položaja rešetke puno je lakše nositi se s dizajnerom.

Da bismo to dokazali, evo primjera kako definirati jednostavnu statičku stranicu sa slikom i tekstom:

DesignElementHandle element = factory.newSimpleMasterPage ("Master Master"); design.getMasterPages (). add (element); GridHandle grid = factory.newGridItem (null, 2, 1); design.getBody (). add (grid); grid.setWidth ("100%"); RowHandle row0 = (RowHandle) grid.getRows (). Get (0); ImageHandle image = factory.newImage (null); CellHandle cell = (CellHandle) row0.getCells (). Get (0); cell.getContent (). add (image); image.setURL ("\" // www.baeldung.com/wp-content/themes/baeldung/favicon/favicon-96x96.png \ ""); LabelHandle label = factory.newLabel (null); cell = (CellHandle) row0.getCells (). get (1); cell.getContent (). add (label); label.setText ("Zdravo, Baeldung svijete!");

Ovaj će kôd generirati jednostavno (i ružno) izvješće:

Uzorak izvješća prikazan na gornjoj slici nalazi se na ovoj stazi: /reports/static_report.rptdesign.

Nakon što kodiramo kako izvješće treba izgledati i koje podatke treba prikazivati, možemo generirati XML datoteku pokretanjem našeg ReportDesignApplication razred.

7. Priključivanje izvora podataka

Ranije smo spomenuli da BIRT podržava mnogo različitih izvora podataka.

Za naš primjer projekta koristili smo jednostavnu CSV datoteku s tri unosa. Može se naći u izvještaji mapa i sastoji se od tri jednostavna retka podataka, plus zaglavlja:

Student, matematika, geografija, povijest, 10,3,8 Tom, 5,6,5 Anne, 7, 4,9

7.1. Konfiguriranje izvora podataka

Da bi BIRT mogao koristiti našu datoteku (ili bilo koju drugu vrstu izvora), moramo konfigurirati a Izvor podataka.

Za našu datoteku stvorili smo datoteku Izvor podataka ravne datoteke s dizajnerom izvještaja, sve u samo nekoliko koraka:

  1. Otvorite perspektivu dizajnera i pogledajte obris na desno.
  2. Desnom tipkom miša kliknite Izvori podataka ikona.
  3. Odaberite željenu vrstu izvora (u našem slučaju ravni izvor datoteke).
  4. Sada možemo odabrati učitavanje cijele mape ili samo jedne datoteke. Koristili smo drugu opciju (ako je naša podatkovna datoteka u CSV formatu, želimo koristiti prvi redak kao indikator imena stupca).
  5. Testirajte vezu kako biste bili sigurni da je put ispravan.

Priložili smo nekoliko slika kako bismo prikazali svaki korak:

7.2. Skup podataka

Izvor podataka je spreman, ali još uvijek trebamo definirati svoj Skup podataka, što su stvarni podaci prikazani u našem izvješću:

  1. Otvorite perspektivu dizajnera i pogledajte obris na desno.
  2. Desnom tipkom miša kliknite Skupovi podataka ikona.
  3. Odaberite željenu Izvor podataka i tip (u našem slučaju postoji samo jedan tip).
  4. Sljedeći zaslon ovisi o vrsti izvora podataka i odabranom skupu podataka: u našem slučaju vidimo stranicu na kojoj možemo odabrati stupce koje ćemo uključiti.
  5. Nakon završetka postavljanja, konfiguraciju možemo otvoriti u bilo kojem trenutku dvostrukim klikom na naš skup podataka.
  6. U Izlazni stupci, možemo postaviti pravu vrstu prikazanih podataka.
  7. Zatim možemo pogledati pregled klikom na Pregled rezultata.

Opet, nekoliko slika za pojašnjenje ovih koraka:

7.3. Ostale vrste izvora podataka

Kao što je spomenuto u koraku 4 Skup podataka dostupne opcije mogu se mijenjati ovisno o Izvor podataka uputiti.

Za našu CSV datoteku BIRT daje opcije povezane s stupcima za prikaz, vrstom podataka i želimo li učitati cijelu datoteku. S druge strane, ako smo imali JDBC izvor podataka, možda ćemo morati napisati SQL upit ili pohranjenu proceduru.

Od Skupovi podataka izbornik, također možemo pridružiti dva ili više skupova podataka u novom skupu podataka.

8. Izrada izvještaja

Jednom kada je datoteka izvještaja spremna, moramo je proslijediti mehanizmu za prikazivanje. Da biste to učinili, potrebno je primijeniti nekoliko stvari.

8.1. Inicijalizacija motora

The ReportEngine klasa, koja interpretira datoteke dizajna i generira konačni rezultat, dio je BIRT runtime knjižnice.

Za obavljanje posla koristi hrpu pomagača i zadataka, što ga čini prilično resursno zahtjevnim:

Izvor slike: Eclipse BIRT dokumentacija

Izrada primjerka motora povezana je sa značajnim troškovima, prvenstveno zbog troškova utovara proširenja. Stoga, trebali bismo stvoriti samo jedan ReportEngine instance i upotrijebite ga za pokretanje više izvješća.

Stroj za izvještavanje kreira se u tvornici koju isporučuje Platforma. Prije stvaranja motora, moramo pokrenuti Platforma, koji će učitati odgovarajuće dodatke:

@PostConstruct zaštićena praznina initialize () baca BirtException {EngineConfig config = new EngineConfig (); config.getAppContext (). put ("spring", this.context); Platform.startup (config); IReportEngineFactory factory = (IReportEngineFactory) Platforma .createFactoryObject (IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY); birtEngine = factory.createReportEngine (config); imageFolder = System.getProperty ("user.dir") + File.separatorChar + reportsPath + imagesPath; loadReports (); }

Kad nam više ne treba, možemo ga uništiti:

@Preuzmi javnu prazninu delete () {birtEngine.destroy (); Platform.shutdown (); }

8.2. Implementacija izlaznog formata

BIRT već podržava višestruke izlazne formate:HTML, PDF, PPT i ODT, da navedemo samo neke.

Za ogledni projekt implementirali smo dvije metode generiratiPDFReport i generiratiHTMLReport.

Neznatno se razlikuju ovisno o specifičnim potrebnim svojstvima, kao što su izlazni format i obrađivači slika.

Zapravo, PDF-ovi ugrađuju slike zajedno s tekstom, dok ih HTML izvješća trebaju generirati i / ili povezati.

Tako, funkcija prikazivanja PDF-a prilično je jednostavna:

privatna praznina generiraPDFReport (izvještaj IReportRunnable, odgovor HttpServletResponse, zahtjev HttpServletRequest) {IRunAndRenderTask runAndRenderTask = birtEngine.createRunAndRenderTask (izvještaj); response.setContentType (birtEngine.getMIMEType ("pdf")); Opcije IRenderOption = novi RenderOption (); PDFRenderOption pdfRenderOption = novi PDFRenderOption (opcije); pdfRenderOption.setOutputFormat ("pdf"); runAndRenderTask.setRenderOption (pdfRenderOption); runAndRenderTask.getAppContext (). put (EngineConstants.APPCONTEXT_PDF_RENDER_CONTEXT, zahtjev); isprobajte {pdfRenderOption.setOutputStream (response.getOutputStream ()); runAndRenderTask.run (); } catch (Exception e) {throw new RuntimeException (e.getMessage (), e); } napokon {runAndRenderTask.close (); }}

Iako je za funkciju prikazivanja HTML-a potrebno više postavki:

privatna praznina generiraHTMLReport (izvještaj IReportRunnable, odgovor HttpServletResponse, zahtjev HttpServletRequest) {IRunAndRenderTask runAndRenderTask = birtEngine.createRunAndRenderTask (izvještaj); response.setContentType (birtEngine.getMIMEType ("html")); Opcije IRenderOption = novi RenderOption (); HTMLRenderOption htmlOptions = novi HTMLRenderOption (opcije); htmlOptions.setOutputFormat ("html"); htmlOptions.setBaseImageURL ("/" + reportsPath + imagesPath); htmlOptions.setImageDirectory (imageFolder); htmlOptions.setImageHandler (htmlImageHandler); runAndRenderTask.setRenderOption (htmlOptions); runAndRenderTask.getAppContext (). put (EngineConstants.APPCONTEXT_BIRT_VIEWER_HTTPSERVET_REQUEST, zahtjev); isprobajte {htmlOptions.setOutputStream (response.getOutputStream ()); runAndRenderTask.run (); } catch (Exception e) {throw new RuntimeException (e.getMessage (), e); } napokon {runAndRenderTask.close (); }}

Najvažnije od svega, postavili smo HTMLServerImageHandler umjesto da napusti zadani rukovatelj. Ova mala razlika ima velik utjecaj na generirano img označiti:

  • zadani obrađivač povezuje img oznaka na stazi datotečnog sustava, blokiran zbog sigurnosti mnogim preglednicima
  • the HTMLServerImageHandler veze do URL-a poslužitelja

Uz setImageDirectory metodom određujemo gdje će motor spremiti generiranu datoteku slike.

Prema zadanim postavkama, voditelj generira novu datoteku na svaki zahtjev, pa mogli bismo dodati sloj predmemoriranja ili politiku brisanja.

8.3. Objavljivanje slika

U slučaju HTML izvješća, slikovne datoteke su vanjske, pa im mora biti dostupan na putu poslužitelja.

U gornjem kodu, s setBaseImageURL metodom, kažemo stroju koji relativni put treba koristiti u img tag link, pa moramo biti sigurni da je staza stvarno dostupna!

Iz tog razloga, u našem ReportEngineApplication, konfigurirali smo Spring za objavljivanje slike mapa:

@SpringBootApplication @EnableWebMvc javna klasa ReportEngineApplication implementira WebMvcConfigurer {@Value ("$ {reports.relative.path}") private String reportsPath; @Value ("$ {images.relative.path}") private String imagesPath; ... @Override public void addResourceHandlers (Registry ResourceHandlerRegistry) {registry .addResourceHandler (reportsPath + imagesPath + "/ **") .addResourceLocations ("file: ///" + System.getProperty ("user.dir") + " / "+ reportsPath + imagesPath); }}

Bez obzira na put koji odaberemo, moramo biti sigurni da se isti put koristi ovdje i u htmlOptions prethodnog isječka, ili naše izvješće neće moći prikazati slike.

9. Prikazivanje izvješća

Posljednja komponenta potrebna za pripremu naše aplikacije je Kontroler za povratak generiranog rezultata:

@RequestMapping (method = RequestMethod.GET, value = "/ report / {name}") @ResponseBody javna praznina generiraFullReport (HttpServletResponse odgovor, zahtjev HttpServletRequest, @PathVariable ("name") Naziv niza, @RequestParam ("output") String String output) baca EngineException, IOException {OutputType format = OutputType.from (output); reportService.generateMainReport (ime, format, odgovor, zahtjev); }

Uz izlaz parametar, možemo dopustiti korisniku da odabere željeni format - HTML ili PDF.

10. Testiranje izvješća

Aplikaciju možemo pokrenuti pokretanjem ReportEngineApplication razred.

Tijekom pokretanja, BirtReportService klasa će učitati sva izvješća koja se nalaze u /izvještaji mapu.

Da bismo vidjeli naša izvješća na djelu, samo moramo usmeriti svoj preglednik na:

  • / report / csv_data_report? output = pdf
  • / report / csv_data_report? output = html
  • / report / static_report? output = pdf
  • / report / static_report? output = html

Evo kako csv_data_report Izvještaj izgleda:

Da bismo ponovno učitali izvješće nakon promjene datoteke dizajna, samo usmerimo naš preglednik na / report / reload.

11. Zaključak

U ovom smo članku integrirali BIRT s Spring Bootom, istražujući zamke i izazove, ali i njegovu snagu i fleksibilnost.

Izvorni kôd članka dostupan je na GitHubu.