ponedjeljak, 6. veljače 2012.

HTTP Status 500 - pa ti pogoditi što je pošlo po krivu?

Upravo sam se igrao sa errorom HTTP Status 500. Naslov koji sam stavio proizlazi iz ovog objašnjenja na webu:

"This is a 'catch-all' error generated by the Web server. Basically something has gone wrong, but the server can not be more specific about the error condition in its response to the client..."

To je prvi rezultat koji je prikazao google, objašnjenje je malo poduže od ovoga, ali ove dve rečenice su mi se urezale u rožnicu! Na svu sreću otklonio sam svoj problem, ali sam išao istražiti što to znači taj status 500. Sva sreća da sam išao tim putem i da tomcat osim statusa 500 ispiše i root cause.  Zamislite samo situaciju gdje bi morali naći bug na samo osnovi ovog statusa 500 - vjerojatno netko može, ali to ipak ulazi u kategoriju hard core mazohizma.

Sada da objasnim kako sam se uopće našao u ovoj situaciji. Naime pošto je ovaj petak počela opsada snijegom i nije baš bilo preporučljivo izlaziti u duge šetnje pejzažom, odlučio sam napraviti nešto što sam jako dugo odgađao - instalirati Mac OS na svoj PC. Malo googlanja, malo youtube, malo blogova i wiki i par sati kasnije imao sam verziju 10.6.6. na svom PC-u. Samo mogu reći da sam oduševljen i da mi je žao što ovo nisam prije napravio. Zašto nije padao snijeg tako malo ranije. :D
Šalu na stranu, to sam napravio kako bih proširio svoje znanje. Naime sav svoj development (oko 90%) uvijek radim na Windowsima 7, pa je došlo vrijeme da vidim kako se to radi i na Mac OS. Linux sam probao, Mac je jedini preostao.
Oduševljen sam svime što najnapredniji OS na svijetu nudi. Ali trebalo je instalirati neke stvari koje su mi od iznimne važnosti - MySQL, PosgreSQL, Eclipse, Tomcat...
PostgreSQL i Eclipse dio je odrađen s lakoćom, s MySQL-om sam se malo pomučio. Ali jedno gledanje youtube clipa je sve riješilo. Naime nisam znao da se mora paliti pod System Preferences. Jedini pravi problem i taj problem bi trebao biti pod navodnicima, je bio instalacija Tomcata. Malo truda i malo prčkanja po terminalu je dalo ploda. Još jedna stvar koja postoji za Mac je Tomcat controller, genijalni mali besplatni programičić s kojim se lako pokreće ili stopira tomcat.


Kažu da slika vrijedi 1000 riječi, pa nadam se da je i s ovom tako. Imate 3 gumba koji sami sebe objašnjavaju. Gumb View vas odvodi na http://localhost:8080. Jednostavno i savršeno radi! Obožavam jednostavne stvari, kao npr. program Skitch pomoću koga je i nastao ovaj screen capture. Ali o tom i sličnim programima bez kojih ne znam kako sam do sada živio u nekom drugom postu.

Vrijeme je da se vratim statusu 500. Ovako je izgledao jedan dio:

Pomoću strjelica sam označio neke stvari na koje treba obratiti pozornost kod traženja bugova koji su doveli do errora.  Prva strijelica nam govori da nije otvoren session od hiberante, što nam daje do znanja da je problem u ORM dijelu aplikacije a ne sa Spring MVC-om. Druga strjelica nam govori da ne može otvoriti konekciju što me je uvelike dovelo do rješenja. Da bi se konekcija otvorila moramo imati dobar url definiran za JDBC, imati ispravne podatke za username i password te moramo imati napravljenu bazu na MySQL serveru (jer kao što sam već pisao u blogu, Hibernate ne može stvoriti bazu na serveru. Tablicu može ali bazu ne, u protivnom baca exception). Treća i četvrta strjelica potvrđuju prve dvije. Nakon druge mi je bilo jasno u čemu je problem. Aplikaciju sam razvijao na Window 7 gdje mi je MySQL server imao root password, a kod instalacije MySQL na Mac OS-u po defaultu on je nema.
Tako je i bilo. Maknuo sam navedeni password u konfiguraciji hibernatea, napravio Maven build, stavio war na Tomcat i voila, aplikacija radi! Zanimljivo kako mala sitnica može izazvati veliki exception report :)

Mislim da bi si svako toliko trebao napraviti neki namjerni bug tipa ovoga passworda da si istreniram oko u pronalaženju i otklanjanju errora. Naime prije nekoliko dana krenuo sam raditi 2 klase koje ću mapirati pomoću Hibernatea. Istina napravio sam obadvije, ali kada sam krenuo raditi prvu uspio sam staviti samo @Entity anotaciju i ništa više. Zaključio sam da je logičnije da prvo napravim drugu klasu do kraja pa da se onda vratim na prvu, nekakav zakon logike mi je to nalagao. Zaboravio sam uopće na prvu klasu, i smaknuo sam je s uma. Kada sam krenuo pokrenuti aplikaciju dobio sam veliki error report gdje sam morao tražiti i iščitavati sve i svašta. Brza google pretraga mi je dala polovični odgovor, ali mi se onda upalila lampica. Stavio sam @Entity anotaciju a nisam @Id, naime Hiberante ove dve anotacije smatra minimum koji mora postojati u suprotnom baca error. Nevjerojatno kako mala stvar može stvoriti veliki problem ako se ne pazi. Doduše ja to sve smatram dobrim treningom.

Nema komentara:

Objavi komentar