tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
5
ZUGRIFFE
926
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    sepan sepan ist offline Mitglied
    Registriert seit
    Jun 2004
    Beiträge
    14
    Hallo,

    ich habe folgende Frage.
    Ich habe ein Stateful Session Bean (Parent), welches beim Aufruf einer Methode z.B. createChild() auf dem Server eine Instanz eines weiteren Stateful Session Beans erzeugt (Child). Diese Instanz soll dem Client zurückgegeben werden, damit dieser die Methoden direkt auf dem Child-Objekt aufrufen kann.
    D.h. die Instanzierung des Child-Objects erfolgt nicht vom Client, sondern am Server, der Client soll jedoch das Objekt nutzen können.

    So stell ich mir das vor:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    
    @Remote
    public interface Parent {
      void setTitle(String title);
      Child createChild(String name);
      void deleteChild(Child child);
    }
     
    @Remote
    public interface Child {
      void setName(String name);
      void setAge(int age);
      // usw.
    }
     
    @Stateful
    public class ParentImpl implements Parent, Serializable {
      private String title;
      private List<Child> children = new ArrayList<Child>();
     
      public void setTitle(String title) {
        this.title=title;
      }
     
      public Child createChild(String name) {
        Child c = new ChildImpl();
        c.setName(name);
        children.add(c);
        return c;
      }
      
      public void deleteChild(Child c) {
        children.remove(c);
      }
    }
     
    @Stateful
    public class ChildImpl implements Child, Serializable {
      private String name;
      private int age;
     
      public void setName(String name) {
        this.name=name;
      }
     
      public void setAge(int age) {
        this.age=age;
      }
    }


    Am Client:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    Hashtable props = new Hashtable();
    props.put(InitialContext.PROVIDER_URL, "jnp://localhost:1099");
    try {
      InitialContext ctx = new InitialContext(props);
      Parent p = (Parent)ctx.lookup("Parent/remote");
      p.setTitle("...");
      Child c = p.createChild("Child 1"); // <- hier
      c.setAge(11);
      ...
    } catch (Exception ex) {
      ex.printStackTrace();
    }

    Kann sowas überhaupt funktionieren?
     

  2. #2
    dontschew dontschew ist offline Mitglied Gold
    Registriert seit
    Mar 2007
    Ort
    Suhl/Thüringen
    Beiträge
    161
    Also dein Grundgedanke ist auf jeden Fall realisierbar aber dei Code ist unvollstandig.
    Geändert von dontschew (13.07.07 um 12:00 Uhr)
     

  3. #3
    sepan sepan ist offline Mitglied
    Registriert seit
    Jun 2004
    Beiträge
    14
    Zitat Zitat von dontschew Beitrag anzeigen
    Also dei Grundgedanke ist auf jeden Fall realisierbar aber dei Code ist unvollstandig.
    Kannst Du mir sagen, was fehlt?
    Ich nehme an, die Klasse Child braucht zusätzlich ein lokales Interface, oder?
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    @Local
    public interface ChildLocal {
      void setName(String name);
      void setAge(int age);
    }
    @Remote
    public interface ChildRemote {
      void setName(String name);
      void setAge(int age);
    }
    @Stateful
    public class ChildImpl implements ChildLocal, ChildRemote, Serializable {
      ....
    }
    wie würde das serverseitig aussehen? So?
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    @Stateful
    public class ParentImpl implements Parent, Serializable {
      private List<ChildLocal> children = new ArrayList<ChildLocal>();
      ....  
      public ChildRemote createChild(String name) {
         ChildImpl c = new ChildImpl();
         c.setName(name);
         children.add((ChildLocal)c);
         return (ChildRemote)c;
      }
      ....
    }
     

  4. #4
    dontschew dontschew ist offline Mitglied Gold
    Registriert seit
    Mar 2007
    Ort
    Suhl/Thüringen
    Beiträge
    161
    Willst du das Child Objekt zum Client übertragen und auf dem Client ausführen oder willst du es nur vom Client aus nutzen und auf dem Server ausführen?
     

  5. #5
    sepan sepan ist offline Mitglied
    Registriert seit
    Jun 2004
    Beiträge
    14
    Ich will es vom Client aus nutzen, ausgeführt soll es aber am Server werden. Also gleich wie bei Parent (remote), jedoch ohne dass die Instanzierung lokal am Client statt findet.
     

  6. #6
    Avatar von Oliver Gierke
    Oliver Gierke Oliver Gierke ist offline Mitglied Rubin
    Registriert seit
    Dec 2003
    Ort
    Mannheim
    Beiträge
    1.457
    Meiner Meinung nach geht das definitiv nicht, was du da machst. Technisch vielleicht, allerdings verstößt du mit deiner Modellierung hochgradig gegen Architekturkonzepte.

    Erstens sind SessionBeans eigentlich Implementierungen des Facade Patterns ergo KEINE Domänenobjekte die man mal eben per Serialisierung über die Leitung jagt. Zweitens unterliegt die Instanzverwaltung von SessionBeans dem Container. Sonst hebelst du das komplette Objektpooling aus.

    Das Problem liegt meiner Meinung nach daran, dass du Entites als SessionBeans modellierst. Das ist halt von Grundauf falsch . Beispiel: Du hast eine Kundenverwaltung. Dabei würdest du dann eine SessionBean CustomerManager implementieren, die mit EntityBeans Customer, Adress etc. Arbeitet. Wass du jetzt an den Client schicken solltest / kannst sind die Instanzen der EntityBeans, nie aber jedoch die Serverkomponente (CustomerManager in dem Fall). Das macht definitiv keinen Sinn, da diese Komponente meist Referenzen auf andere Komponenten enthält (EntityManager usw.) Wie willst du die denn bitte serialisieren?

    Scheint, als hättest du das Konzept noch nicht so richtig verinnerlicht.

    Gruß
    Ollie
     

Ähnliche Themen

  1. Stateful-Bean verliert seine Werte warum?
    Von ceene im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 13
    Letzter Beitrag: 10.08.10, 12:56
  2. ClassCastException bei Aufruf einer Stateful Session Bean
    Von Urmel103 im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 12
    Letzter Beitrag: 13.02.09, 19:03
  3. RCP EJB3 Remote Collection -> InvocationException
    Von maksbor80 im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 7
    Letzter Beitrag: 27.05.08, 20:18
  4. Bean Instanz finden
    Von lernen.2007 im Forum Java
    Antworten: 3
    Letzter Beitrag: 26.11.07, 08:31
  5. Zugriff auf entity bean. EJB3 Jboss hibernate
    Von derHarri im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 0
    Letzter Beitrag: 11.04.07, 19:49