Spring Vaadin integracja - dwa egzemplarze tej klasy

0

Witam

Mam pewien problem, z którym od dłuższego czasu nie mogę sobie poradzić.

Pojawił się on gdy do aplikacji wprowadziłem scope - sesyjny, dokładniej do kontenera springowego.

Dokonałem integracji springa z vaadinem zgodnie z tym artykułem
http://java.dzone.com/articles/vaadin-spring-integration

Dodałem servlert do deskryptora wdrożenia.

<servlet> <servlet-name>SpringVaadinServlet</servlet-name> <servlet-class>pl.com.vaadin.servlet.SpringApplicationServlet</servlet-class> <init-param> <param-name>applicationBean</param-name> <param-value>applicationBean</param-value> </init-param> </servlet>

W pliku applicationContext.xml powiązałem główne okno z servletem.

<bean name="applicationBean" class="pl.com.ui.main.MainVindowImpl"> <property name="centerViewImpl" ref="centerViewImpl" /> <property name="leftViewImpl" ref="leftViewImpl" /> </bean>

Wszystko działało dobrze do momentu gdy zmieniłem zasięg komponentów w kontenerze.
(Z dokumentacji wiadomo, że komponent bez podanego scope jest singletonem. )
Jak widać do głównego okna dodałem referencje dwóch innych komponentów, które tez mam zarejestrowane w kontenerze springowym.
W momencie gdy zmieniłem zasięg właśnie tych dwóch komponentów na session, dostałem po dwa różne egzemplarze każdego komponentu. Nie wiem jak się pozbyć tych niepotrzebnych egzemplarzy.
Oczywiście aplikacje odpalam na serwerze aplikacyjnym tomcat 6.
Jeśli ktoś zna problem lub domyśla się w czym leży przyczyna , wdzięczny był bym za wskazówki.

Pozdrawiam.

0

No jak masz 2 sesje to dostalesz 2 rozne egzemplarze ziaren sesyjnych, ot co. Jakiego wyniku oczekujesz?

0

A gdzie jest ta druga sesja bo ja jej nie widzę. Główne okno też jest oznaczone scopem sesion.
Zakładam, że chodzi Ci o to, że servlet tworzy jedną sesję a springowy kontener drugą ??
Ale przecież one są powiązane.
Poza tym jak komponent oznaczony scopem session może przeniknąć do innej sesji w innej przeglądarce ? - jeśli o tym myślisz, bo mi cały czas chodzi o to, że dostaję dwa egzemplarze obiektu podczas tworzenia jednej sesji.
Wskaż miejsce błędu bo gdybym go widział to bym nie pisał tu, a nie zadajesz dziwne pytania i najlepiej podpowiedź jak usnąć ten błąd.

0

A ty mnie pocaluj w ... nos z takim tonem i wymaganiami. Chcialem pomoc, teraz mam to w dup|e. Podpowiem tylko ze wydaje mi sie ze kompletnie zle rozumiesz sesje, podejrzewam ze nawet nie wiesz co to ta sesja i czego dotyczy.

0

Sam zacząłeś taką sytuację. Nie wymagałem od Ciebie pomocy i nadal nie oczekuję. Nigdzie Cie nie będę całował. Jak masz problem idź do lekarza. Poprosiłem o pomoc a Ty mi jej nie udzieliłeś tylko burknołełeś na mnie. Skoro nie zamierzałeś nic wnieść do mojego zasobu wiedzy to czemu zabierałeś głos.

0

Chyba cos Ci sie pomylilo. Z tego co widze odpowiedzialem dlaczego masz 2 instancje i spytalem czego oczekujesz - skad ktokolwiek ma wiedziec co Ty sobie myslisz, co to sa sesje itp? Chcialem sie dowiedziec czegos wiecej. Gdzie widzisz jakies burkniecia?

0

Ja to tak odebrałem, że masz właśnie takie nastawienie odnośnie mojego pytania. Jeśli się pomyliłem to przepraszam. Zaistniała sytuacja taka sama jaką teraz przedstawiłeś.

Zgodnie z dokumentacją vaadina :
When the web container gets the first request for a URL registered for an application, it creates an instance of the ApplicationServlet class in Vaadin framework that inherits the HttpServlet class defined in Java Servlet API. It follows sessions by using HttpSession interface and associates an Application instance with each session. During the lifetime of a session, the framework relays user actions to the proper application instance, and further to a user interface component.

Czyli ja to rozumiem tak, vaadin łącz instancję klasy application z sesją servletu czyli w tym wypadku przeglądarki. Dalej idąc powiązaliśmy springowy kontener z komponentem, który dziedziczy po application wiec teoretycznie powinienem być w tej samej sesji. Tak to rozumiem na chwilę obecną.

Raz jeszcze przepraszam za słowa ale ja na prawdę odebrałem to jak byś napisał coś od niechcenia.

0

A gdzie / jak widzisz, ze sa 2 instancje komponentow Vaadina? W jaki sposob podgladasz ile ich jest?
Sesje dzialaja tak - laczy sie nowy klient, tworzona jest sesja, tworzone sa komponenty Vaadina. Czyli: 2 klienci, 2 sesje, 2 glowne formy, 10 klientow, 10 secji, 10 form.

0

Już tłumaczę, stworzyłem statyczną metodę w klasie o nazwie licznik, która mnie informuje ile obiektów tej klasy powstało. Gdy miałem ustawiony scope na singleton to dostawałem oczywiście liczbę 1. Gdy zmieniłem na session dostaję 2. Problem w tym ze to są komponenty z layoutem, do których przekazuje odpowiednie widoki związane z funkcjonalnością. W momencie dodawania takiego widoku do utworzonego komponentu, nie pojawiał się on w kliencie, a wiem że powstawał.

0

No ok, nie wiem czemu sie nie dodaje skoro powstaje, ale powod dla ktorego widzisz 2 a nie 1 jest jasny i wynika dokladnie z tego co napisalem - sesja oznacza ze dla kazdej sesji (kazdego nowego klienta*) tworzony jest nowy komponent.

Piszesz w 1. poscie ze glowne okno nadal jest singleton (tak zrozumialem), a to jest zle. Singleton jest tworzony raz i wstrzykiwane sa do niego zaleznosci, ale tylko raz. Musisz albo zmienic tego beana rowniez na session, albo wstrzykiwac nie bezposrednio zaleznosci, lecz proxy, ktore same beda umialy wybrac odpowiednie instancje z sesji. Drugie rozwiazanie duzo trudniejsze i niepotrzebne moim zdaniem.

W 1. poscie piszesz rowniez ze chcesz sie pozbyc niepotrzebnych instancji. Otoz moim zdaniem one sa potrzebne, przeciez chcesz miec rozne okna i rozny stan UI dla osobnych klientow? Nie chcesz pewnie aby klient A mieszal cos w UI ktore widzi klient B?

  • 1 klient to jest dla mnie jedna przegladarka na kompie. Jak np z tego samego kompa polaczysz sie za pmoca 2 przegladarek to sa juz 2 klienci. Mozliwe ze nawet jak uzywasz IE to 2 osobne taby to 2 klienci, ale np FF z tego co wiem wspoldzieli cookisy i sesje miedzy swoimi zakladkami.
0

Po pierwsze implementacja serwletu springowego. Vaadin nie dostarcza domyślnej implementacji i możesz tam robić różne dziwne rzeczy. Skopiowałeś go z vaadinowego forum jak rozumiem.
Po drugie MainVindowImplto klasa główna aplikacji jeżeli tak to powinna być w scope session, bo w przeciwnym wypadku wszyscy klienci dostaną ten sam obiekt.

0

Po woli dochodzę do sedna problemu. Mam jeszcze pewne pytanie jeśli można. Jaka jest różnica po między zarejestrowaniem beana w pliku konfiguracyjnym springa, a nadaniem mu adnotacji @component i @scope session? Gdy usunąłem wpis w pliku i dodałem adnotacje problem zniknął. O wcześniejszych rzeczach, o których oboje mówiliście zdawałem sobie sprawę. Jeśli chodzi o integrację springa i vaadina to tak, posiłkowałem się tym co jest na spring vaadin integration viki repozytorium kodu. Trochę tą klasę zmodyfikowałem.

Z góry dziękuję za pomoc.

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