Informacioni sistemi 1/JPA i REST
Pređi na navigaciju
Pređi na pretragu
Na drugoj laboratorijskoj vežbi radi se JPA (Java Persistence API) i REST (Representational State Transfer). Vodič ispod služi za uspešno postavljanje alata na vašem računaru i kao pomoć pri najčešćim greškama na koje možete naići pri vežbanju i izradi laboratorijske vežbe i napisan je tako da se najčešće greške mogu lako potražiti.
Postavka
Sledeći postupak bi trebalo da vas dovede do uspešne postavke kako biste bili spremni za pokretanje nekog REST projekta sa stranice predmeta. Instrukcije za prvu laboratorijsku vežbu su i dalje potrebne.
- Instalirajte MySQL Workbench. Alternativno, pokretanje bilo kakvog MySQL (ili MariaDB) servera na računaru će raditi. Na primer, možete instalirati XAMPP, pokrenuti MySQL server na njemu i koristiti phpMyAdmin kao interfejs.
- Pri instalaciji MySQL Workbench, izaberite Developer Default opciju, od koje će vam relevantne komponente biti MySQL Server i MySQL Workbench, pa ukoliko instalacija prijavi da se neka druga komponenta ne može instalirati možete je preskočiti.
- Obavezno postavite lozinku za root korisnika pri instalaciji. Ukoliko je zaboravite, možete pokušati da je ponovo postavite pomoću ovog uputstva. Ukoliko ni to ne radi, najbolje instalirajte MySQL Server iznova.
- Da biste pokrenuli MySQL server na Windows operativnom sistemu, možete otvoriti Command Prompt kao administrator i pokrenuti sledeće komande: zatim potražiti Services opciju u Start meniju, i uključiti servis sa prefiksom MySQL.
cd "C:\Program Files\MySQL\MySQL Server 8.0\bin" mysqld --install mysqld --initialize
- Stefan Tubić je na vežbama menjao
my.inifajl kako bi podesio podrazumevani storage engine na InnoDB. Ovo nije potrebno, jer je nakon nove instalacije storage engine već postavljen na InnoDB.
- Preuzmite Connector/J. Kada vas pita za verziju, izaberite Platform Independent, i trebalo bi da dobijete jedan JAR fajl. Nakon toga, taj fajl možete ubaciti u direktorijum sa vašom instalacijom GlassFish servera, u direktorijum
glassfish/lib. - Pokrenite NetBeans i GlassFish server. Ukoliko je bio pokrenut pre nego što ste ubacili Connector/J, zaustavite ga i ponovo pokrenite.
- Napravite novi JDBC Connection Pool. Parametri su sledeći:
- Resource Type:
javax.sql.DataSource - Database Driver Vendor: MySql
- Ukoliko ste na GlassFish 5.0 i pređete preko tekstualnog polja nakon Database Driver Vendor, vrednost će biti izbrisana.
- Datasource Classname:
com.mysql.cj.jdbc.MysqlDataSource - U dodatnim svojstvima konekcije podesiti:
password: Lozinka vašeg MySQL korisnika, ne sme da bude prazna i možete je promeniti iz MySQL Workbench → Admnistration → Users And Privileges (ili koristećiALTER USER)databaseName: Naziv vaše MySQL bazeserverName:localhostuser: Naziv vašeg MySQL korisnika, podrazumevano postoji korisnik sa nazivomroot.portNumber: Podrazumevano 3306, ali ponekad MySQL Workbench može da postavi na 3308.
- Resource Type:
- Testirati Connection Pool koristeći Ping dugme.
- Ukoliko dobijate grešku u vezi sa
com.mysql.cj.jdbc.MysqlDataSourceili nekim keystore fajlom (Keystore was tampered with...), probajte da preko dugmeta Add Property u Additional Properties tabu dodate svojstvouseSSLsa vrednošćufalse.- Ukoliko nakon ovoga dobijate grešku u vezi sa public key retrieval, dodajte svojstvo
allowPublicKeyRetrievali postavite ga natrue.
- Ukoliko nakon ovoga dobijate grešku u vezi sa public key retrieval, dodajte svojstvo
- Ukoliko i nakon koraka iznad dobijate grešku u vezi sa drajverskom klasom, proverite da li ste na dobro mesto ubacili JAR fajl od Connector/J. Ukoliko imate više GlassFish servera na računaru, proverite da li ste u dobar server ubacili. Probajte da pored
glassfish/libubacite JAR fajl i uglassfish/binidomains/domain1/lib. - Ukoliko kao greška izađe "Communications link failure", proverite da li vam je uključen MySQL server, odnosno da li možete da se na njega povežete iz nekog drugog programa, poput MySQL Workbench. Takođe proverite da li gađate dobar port, pošto je podrazumevani port 3306, a ne 3308 kako je pokazano na vežbama.
- Ukoliko u bilo kom trenutku postavke GlassFish server izbaci grešku u vezi sa
getOutputStream(), samo pokušajte ponovo.
- Ukoliko dobijate grešku u vezi sa
- Napraviti JDBC Resource sa novonapravljenim Connection Pool kao konekcijom.
- Unutar NetBeans u Services → Databases kliknite desnim klikom na Drivers i izaberite New Driver.
- Kod Driver File(s) izaberite Add i onda izaberite Connector/J JAR fajl koji ste ubacili u
glassfish/libdirektorijum, pa dodajte drajver. - Trebalo bi da vam postane dostupna opcija Register MySQL server pri desnom kliku na Services → Databases. Kada to izaberete, možete dodati parametre vašeg MySQL servera slične onima koje ste dodavali za JDBC Connection Pool.
- Ovaj korak vam omogućava da izaberete ovu konekciju kada radite New → Entity Classes from Database.
- U vašem
persistence.xmlfajlu, u Source tabu, sada možete zameniti sadržaj<jta-data-source>taga sa nazivom vašeg JDBC resursa. - Kao dodatan alat za testiranje vaše REST aplikacije možete preuzeti Postman.
Ukoliko pokrećete novi REST projekat, izaberite Java with Maven → Web Application. Obavezno gledajte GlassFish Server tab kako biste uočili greške koje se javljaju tokom izvršavanja.
Napomene
- Ukoliko ste napravili novi prazan projekat i on ne može da vam se pokrene zbog greške poput "Unable to load the mojo 'war' in the plugin 'org.apache.maven.plugins:maven-war-plugin:2.3' due to an API incompatibility", moguće je da imate više verzija JDK (Java Development Kit) instaliranih na računaru, i da podrazumevani JDK nije podešen na 1.8. Pokušajte da obrišete ostale JDK sa računara, i da postavite podrazumevani na 1.8. Podrazumevani JDK može da se menja dodavanjem putanje do JDK 1.8 u
netbeans_jdkhomeopciju unetbeans.conffajl, ili jednostavno reinstalacijom NetBeans. - Ukoliko imate problema sa generisanjem entitetskih klasa, poput toga da se generišu prazne klase, instalirajte NetBeans verziju 12.0.
- Ukoliko vam se entitetske klase generišu bez JAXB anotacija i nemate opciju da to izaberete prilikom generisanja, proverite da li vam je verzija JDK dobro podešena za projekat, a onda uradite Clean and Rebuild.
- Ukoliko vam se desi HTTP greška 404 (Not Found):
- Prvo proverite da li ste dobro upisali putanju endpoint-a. Endpoint-ovi su generalno na putanji
localhost:8080/ProjectName/ApplicationPath/ResourcePath/EndpointPath, gde:ProjectNameje ime vašeg projekta, na primerrestapi,ApplicationPathje određeno anotacijom@ApplicationPathiznad glavne klase vašeg projekta, odnosno klase izvedene izApplication(podrazumevano postavljeno naresources),ResourcePathje određeno anotacijom@Pathiznad klase resursa kojem pristupa, na primerpopravke, iEndpointPathje određeno anotacijom@Pathiznad metode za taj endpoint.
- Ukoliko je endpoint sigurno dobar, moguće je da je aplikacija undeploy-ovana zbog neke greške u trenutnom projektu ili nekoj od prethodnih iteracija. Možete pokušati da restartujete GlassFish server i pratiti server log (GlassFish Server tab u Output prozoru) da vidite ukoliko se pojavljuje neka greška.
- Prvo proverite da li ste dobro upisali putanju endpoint-a. Endpoint-ovi su generalno na putanji
- Ukoliko vam se dešava HTTP greška 500 (Internal Server Error), trebalo bi da deo greške vidite na stranici, ali celu grešku možete pronaći u server logu.
- Ukoliko vam se u endpoint metodi nađe argument bez anotacije pored sebe, takav argument se šalje kroz telo (body) zahteva, i u Postman treba postaviti body na raw opciju. Na primer,
Stringargument se šalje sa tipom sadržajatext/plain(Text opcija u Postman), dok se tip sadržaja neke druge klase šalje kao XML reprezentacija te klase sa tipom sadržajaapplication/xml(XML opcija u Postman). - Ukoliko dobijate
TransactionRequiredExceptiongrešku pri slanju upita na neki endpoint, proverite da li ste stavili@Statelessanotaciju iznad klase resursa. - Ukoliko dobijate HTTP 405 (Method Not Allowed) grešku, to verovatno znači da šaljete GET zahteve na endpoint koji prima zahteve samo preko drugih metoda.
- Stefan Tubić na vežbama za MySQL server koristi port 3308. Standardni i podrazumevani port za MySQL je 3306, tako da bi trebalo da taj port koristite osim ako ga niste menjali.
- Ako imate više od jednog MySQL servera na računaru, možda bude potrebno da jednom promenite port. Moguće je da je zbog ovoga Stefanu Tubiću port bio promenjen na 3308.
- Stefan Tubić je pred kraj jednih vežbi napravio grešku kada je pisao
persistence.xmlfajl i napisao<jta-data-resource>umesto<jta-data-source>, pa je na sledećem snimku učitao gotov projekat i grešku pripisao pogrešnoj verziji Jave. Ovo vam može praviti problem ukoliko vam se javlja greška kako tabelaKamionne postoji. Takođe, u istom tompersistence.xmlfajlu je pisalotransactionTypeumestotransaction-type, što vam isto može praviti problem. - U gotovom projektu za kompaniju za prevoze (
kzp, projekatrestapi) uMehanicari.javafajlu nalazi se@PersistenceContext(unitName = "my_persistence_unit"), iako se jedinica perzistencije zoveZad3PU. To može prouzrokovati neke greške, barem u ovom resursu. - Ukoliko vam se prilikom vraćanja odgovora sa servera desi
StackOverflowException, verovatno vam se desila beskonačna rekurzija pri serijalizaciji objekta zbog nedostatka@XmlTransientanotacije koja sprečava serijalizaciju nekog polja. To se obično dešava kada klasaAima polje tipaBiliList<B>, a klasaBpolje tipaAiliList<A>, pa serijalizator radi sledeće:- kreće sa serijalizacijom objekta klase
A, - nađe njegovo polje tipa
Bi vidi da nema anotaciju@XmlTransient, - kreće sa serijalizacijom objekta klase
B, - nađe njegovo polje tipa
Ai vidi da nema anotaciju@XmlTransient, - ponovo kreće sa serijalizacijom istog objekta klase
Ai tako u krug...
- Primer ovoga može da bude sa vežbi sa kompanijom za prevoz, gde, ukoliko entitet
Zaposlenne bi imao@XmlTransientanotaciju iznadgetMehanicar()iligetVozac()metode, dešavala bi se beskonačna serijalizacija tih entiteta.
- kreće sa serijalizacijom objekta klase