RMI i zwracanie ArrayList

0

witam,
jak w temacie. Z klienta rmi wykonuje metode ktora zwraca arraylista i otrzymuje jedynie wyjatek :D

java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
	java.lang.ClassNotFoundException: access to class loader denied

google daje mi jedynie jakis bulgot. Inne metody chodza ok.

0

ArrayList implementuje interfejs serializable wiec nie jest to win a tej klasy. czy klient ma dostep do klas programu? (czy uzywa tych lkas lokalnie, czy ma dobra sciezke i uprawnienia do codebase)?

0

jesli wywoluje w cliencie metode ktora zwraca czystego stringa z tej samej klasy (Plik) to wszystko chodzi ok. Jak chce wywolac metode ktora zwraca ArrayLista z obiektami typu Plik to dostaje ten wyjątek.

0

wiec problem lezy w klasie Plik (bo rozumiem ze wlasnie lista plikow jest zwracana przez zdalna metode), klient moze nie miec prototypu tej klasy. albo trzeba klase Plik dolaczyc do klienta albo pozwolic mu ja skads pobrac. (najprostrzy test jesli chodzi o ArrayList to zwrocic liste stringow i zobaczysz, ze dziala);

0

to co moge zrobic oprocz wygenerowania Stuba i skopiowania go do klienta?

Ok jesli problem z klasa plik...ale czemu inna metode z tej klasy moge wywolac bez problemu?

wydaje mi sie ze chodzi o ustawienie codebase przy uruchamianiu serwera/klienta ale nie mam pojecia jak to ma wygladc :/

0

od wersji 5 nie musisz generowac namiastek.
najprosciej jest spakowac wszystkie klasy z ktorych korzysta twoja aplikacja do jednego pakietu i zaimportowac ten pakiet w kliencie i w serwerze.
co do codebase to tutaj masz opisane co i jak</url>

0

hm ale nie chce klientowi udostepniac plikow moich klas i wydaje mi sie ze w takim przypadku uzywanie RMI nie mialoby sensu.

Teraz blad wyraznie mowi ze nie ma klasy

java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
	java.lang.ClassNotFoundException: pl.ka.mi.klasy.Plik

ale ma namiastke obiektu....wiec czemu potrzebna mu klasa? Jak to obejsc?

0

jezeli klient ma pracowac na obiektach danej klasy to musi znac jej prototyp. nie ma (a przynajmniej ja nie znam) sposobu zeby cos pracowalo na tablicy danej klasy nie wiedzac co to za klasa

0

Jak pisze dam1en, wirtualna maszyna Java musi miec bytecode ktory ma wykonac - niemozliwe jest wykonac kod ktorego sie nie zna, prawda?
W RMI robi sie to tak, ze tworzysz interfejs Plik, ktory ma jakiestam metody. Interfejs plik dajesz i klientowi, i musi byc w classpath, i serwerowi. Serwer dostarcza implementacje, np PlikImpl. Na serwerze (moze byc to jednak inny serwer) ustawia sie pomocniczy serwerek, np serwer http (w tutorialu suna do RMI jest malutki serwerek http do sciagniecia), i ustawia sie codebase na adres tego serwerka (moze byc localhost, ale moze byc co innego). Tam znajduje sie implementacja PlikImpl, badz w jarze badz osobno, w strukturze katalogow odpowiadajacej pakietom.
Teraz, klient pobiera namiastke dla obiektu na serwerze, i ta namiastka zwraca obiekty typu Plik (czyli interfejsu, moze byc rowniez tak jak u Ciebie, ArrayList<Plik>, niewazne). Uruchamiajac klienta RMI ustawiasz codebase na mniej wiecej to samo co na serwerze RMI (np serer mial codebase http://localhost:8080, to klienta moze miec localhost:8080 jesli uruchamiasz oba na tej samej maszynie, albo miec np 192.168.1.17 jesli to inny komp w danej sieci, lub http://host:80, jesli to jest maszyna daleko het het w internecie, np w drugim pokoju, i ma byc dostepna dla kazdego). System RMI widzac ze sciagnela ArrayLista obiektow PlikImpl (wie to bo nazwa klasy jest serializowana jakostam), i probuje jej szukac lokalnie - nie znajduje, wiec probuje sciagnac ja z codebase ktore ustawiles. Uzywajac np URLClassLoader sciaga jara / klase na lokala, i ja wczytuje i odpala jej bytecode. Voila, dziala.
Odsylam do tutoriala sunowego, tam jest ladnie opisany przyklad, przy czym tam i serwer i klient RMI maja swoje serwery z implementacjami klas. Zauwazyc nalezy rowniez, ze kod ktory jest sciagany z neta musi miec ograniczenia co do tego co moze robic, a wiec aplikacja ktora sciaga kod musi miec ustawiony RMISecurityManagera (zdaje sie ze domyslnie mozna robic to co moze aplet, czyli np nie mozna czytac plikow na lokalnym dysku), i ewentualnie pododawac do niego uprawnienia.
Pozdro.

0

Aha, i ten sciagniety bytecode nie jest zapisywany nigdzie w pliku tylko sobie tkwi w pamieci JVM, po wylaczeniu nie ma po nim sladu.

0

no ok dziekuje bardzo za odpowiedzi. na razie po prostu zrobilem jara z klasami serwera i zaimportowalem u klienta. Dziwilo mnie ze metode klasy ktora zwraca Stringa mozna wykonac bez problemu a juz metode ktora zwraca obiekt tej klasy nie bardzo.

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