# ArrayList behält Werte nicht



## Der Dieter (8. Sep 2008)

Hallo,
ich habe ein eher merkwürdiges Problem mit EJB 3.0 (GlassFish V2) und ArrayList.
Und zwar bleiben die Elemte in einer ArrayList irgendwie nicht erhalten.

Zuerstmal meine Klassen (ohne import Anweisungen):


SessionBean.java - Der Java Client hält nur ein Objekt dieser Klasse

```
@Stateful
public class SessionBean implements Session {
    private Warenkorb warenkorb = new Warenkorb();
     public Warenkorb getWarenkorb() {
        return this.warenkorb;
    }
}
```


Warenkorb.java - Eine Hilfsklasse, mit der der Java Client dann später auf seinen Warenkorb zugreifen kann

```
public class Warenkorb implements java.io.Serializable  {
    public ArrayList<String> warenkorb = new ArrayList<String>();

     public int add(String item) {       
            warenkorb.add(item);             
           return warenkorb.size(); //Gib neue Größe zurück
     }

     public int size() {
           return warenkorb.size();
     }
}
```


ShopClient.java - Der Client für den Shop

```
public class ShopClient {
    @EJB
    private static Session ses;

    public static void main(String[] args) {
            System.out.println("Anzahl der Items wenn ich eins hinzufüge:" + ses.getWarenkorb().add("abc"));
            
            System.out.println("Dein Warenkorb enthält "+ses.getWarenkorb().size() + " Gegenstände");
            
    }
}
```


So das klappt alles einwandfrei, aber:
Also die Ausgabe ist:
Anzahl der Items wenn ich eins hinzufüge: 1
Dein Warenkorb enthält *0* Gegenstände.

Das gleiche passiert, wenn ich die ArrayList direkt anspreche, also wenn ich nach dem Add ses.getWarenkorb().warenkorb.size() aufrufe, so erhalte ich auch eine 0.

Das heißt also, er fügt der ArrayList das Element ('abc') ganz normal hinzu, es bleibt aber nicht weiter erhalten.

Meine Idee wäre nun, dass der getWarenkorb() irgendwie immer neu intialisiert, was aber irgendwie auch keinen Sinn macht.


Wäre echt super wenn mir jemand weiterhelfen könnte, irgendwie verzweifel ich langsam daran.


----------



## FArt (8. Sep 2008)

Das einzige was mir auffällt, die die Instanziierung des Warenkorbs. Ein EJB ist nach der Ausführung des Konstruktors noch in einem nicht spezifizierten Zustand.
Du solltest den Warenkorb in einer Methode mit der Annotation @PostConstruct instanziieren, das stellt sicher, dass für jede neue Sessin ein neuer Warenkorb erstellt wird.


----------



## Der Dieter (9. Sep 2008)

Hallo,
nein, das hat leider auch nicht geholfen.

Wenn ich aber die add Methode in die SessionBean aufnehme, also:

SessionBean.java

```
@Stateful 
public class SessionBean implements Session { 
    private Warenkorb warenkorb = new Warenkorb(); 
     public Warenkorb getWarenkorb() { 
        return this.warenkorb; 
    } 
   
    public void addWarenkorb(String item) {
           warenkorb.add(item);
    }
}
```


ShopClient.java

```
public class ShopClient { 
    @EJB 
    private static Session ses; 

    public static void main(String[] args) { 
            ses.addWarenkorb("abc"); 
            
            System.out.println("Dein Warenkorb enthält "+ses.getWarenkorb().size() + " Gegenstände"); 
            
    } 
}
```


Dann klappt es einwandfrei, "abc" wird der ArrayList hinzugefügt und es bleibt darin enthalten.

Meine Idee wäre nun:
Mit ses.getWarenkorb() wird der Warenkorb serialisiert, zum ShopClient gesendet und dort das Objekt neu erstellt.
Wenn ich dann beim shopClient die add-Methode des Warenkorb aufrufe, dann wird dieses nur beim Objekt des Clients durchgeführt, sprich, "abc" wird nur beim Objekt des Clients hinzugefügt und nicht beim Warenkorb-Objekt des Servers.

So würde ich es beurteilen, ob es stimmt, kann ich nicht sagen.


Wie lässt sich dieses nun lösen?
Einen Wrapper für alle möglichen Klassen möchte ich eher ungern in die SessionBean aufnehmen, da dieses die SessionBean unnötig aufblähen würde und kein schönes Klassendesign entspräche.
Man könnte den Warenkorb ebensfalls als Statefull Bean erzeugen, problem ist hier, wie kann der Client die ausschließlich über Session.getWarenkorb() abrufen?

Oder gibts noch andere Lösungen?


Über Antworten wäre ich dankbar.


----------

