JSF, converter i dostep do bazy danych przez EJB

0

Witam,
Stworzylem sobie converter (string na obiekt i odwrotnie). Sam converter dziala, ale nie mam dostepu do wstrzykiwania @ejb z poziomu klasy nie bedacej ManagedBeanem. Samo dopisanie klasy konwertera jako ManagedBean w faces-config.xml nie zadzialalo (request scope), z reszta wydaje mi sie to glupie i nie rozumiem czemu ludzie polecaja taka metode i nie mam pewnosci, ze to zadziala. W kazdym razie widzialem kody dla Javy EE 6, ktore tak robia (konwerter z adnotacja @ManagedBean).

Po co mi converter? Chce pobierac dane do listy rozwijanej (z bazy danych, to idzie z poziomu ManagedBeana), a potem w konwerterze ze Stringa wyszukiwac obiekt w bazie. Odpowiednia metoda w DAO dziala, tylko jak sie do niej dostac, skoro jest w @ejb? Jest to czesc bardzo banalnego z pozoru CRUDa (relacja wiele do jednego).

Na stackoverflow.com ludzie pisze, aby uzywac InitialContext() i bezposrednio wywolywac JNDI, ale to jakas masakra: obrzydliwy sposob, czy w profesonalnych projektach ludzie tak robia? Na dodatek musze uzywac Java EE 5 (EJB 3.0 i JSF 1.2). Ponac w JSF 2.2 juz umozliwiono taka mozliwosc.
http://stackoverflow.com/questions/2019495/inject-a-ejb-into-a-jsf-converter-with-jee6

  1. Dlaczego nie mozna wstrzykiwac @ejb w Converterze?
  2. Jesli nie przez EJB, to jak uzyskac dostep do bazy z poziomu convertera?
  3. Czy ten InitialContext() to na serio, bo ta metoda wydaje mi sie wyjatkowo paskudna. A ja chce tylko wywolac moje DAO i wyszukac obiekt.
  4. Czy profesjonalisci nie uzywaja @ejb w konwerterach i jesli tak to dlaczego.

Pozdrawiam,

Piszac konwerter wzorowalem sie na:
http://balusc.blogspot.ch/2007/09/objects-in-hselectonemenu.html

A moze po prostu zaimplementowac interfejs Converter w obecnym managedBean, w ktorym robie CRUD?

0
  1. Bo wstrzykiwanie może odbywać się tylko do obiektów zarządzanych przez kontener IoC /EJB, to chyba oczywiste. Pomyśl trochę nad tym jak działa IoC. To nie jest żadna magia. Ot, kontener tworzy obiekty i ustawia im odpowiednie zależności. Jeśli dany obiekt nie jest zarządzany przez kontener IoC/EJB to siłą rzeczy kontener nic mu wstrzyknąć nie może. Tak się dzieje właśnie w ty przypadku.
  2. A czemu nie możesz jednak zrobić tego konwertera managed beanem? Innej opcji raczej nie ma -> albo to będzie obiekt zarządzany przez kontener, albo będziesz musiał 'ręcznie' sobie pobrać tą referencje z jndi.
  3. No niestety ale jak chcesz wyciągać coś na jana przez jndi to innej drogi nie ma ;] Dla spokoju sumienia możesz sobie zrobić jakąś utilową klasę która to przynajmniej jakoś opakuje.
  4. To już zależy od problemu który rozwiązujesz. Ogólnie to trochę dziwna sytuacja kiedy konwerter musi się odwoływać do jakiegoś serwisu albo do logiki biznesowej. Częściej chyba w waliadtorze potrzeba dostępu do jakiegoś EJB, szczególnie jeśli chodzi o DAO.
0

Racja, zrezygnowalem z convertera: nie powinien do tego sluzyc (pewne pomysly, ktore przychodza na poczatku nauki jakiejs technologii nie zawsze sa dobre). Ale zawsze czegos sie nauczylem. Dostep do bazy realizuje na samym ManagedBeanie i mam duzo prostsza i lepsza architekture. Ale dzieki za wytlumaczenie, duzo mi rozsjasniles.

BTW. Czy walidatory pozwalaja na wstrzykniecie EJB, bo tam dostep do bazy jest juz bardziej uzasadniony? Jesli nie, jak sie za nie zabrac bez wyszukiwania JNDI oraz wstrzykiwania @ejb?

0

Niestety ale zwykły JSFowy faces validator nie jest zarządzany przez kontener, ergo odpowiedzi są takie same jak do pytania o konwerter.
Jeśli chodzi o "zasadność" takiej operacji to może istnieć taka potrzeba, ale raczej bardzo bardzo rzadko. Zwykle walidator zajmuje się tylko testowaniem "syntaktycznym" a nie "semantycznym" danych. Analiza semantyczna dzieje się już po stronie bazy danych i jak poleci wyjątek to go łapiemy i wyświetlamy użytkownikowi błąd. Ale nie jest to żadna reguła. Można się bawić w testowanie w walidatorze bardziej skomplikowanych rzeczy, to już zależy od zastosowania.

0

Zerocenie wlasnego wyjatku przez baze brzmi stosunkowo prosto i rozsadnie. Stworze wiec wlasna hierarchie wyjatkow, ktore bede lapal w momencie dodawania do bazy. No i jesli zlapie konkretny wyjatek, to wysle message, ktory wyswietle sobie w <h:messages />

Dziekuje.

1 użytkowników online, w tym zalogowanych: 0, gości: 1