Problem mit Variablen

ceene

Erfahrenes Mitglied
Hallo ihr lieben

Ich habe da mal eine verständniss-Frage zu Variablen in EJBs.
Ich habe Stateful-Session-Beans und will auch zwischen diesen Beans Daten übergeben.

Ich mache das Bean über die Annotation @EJB bekannt und dann über eine set-Methode der Variablen will ich den Wert übergeben.
Wenn dann aber das Bean dem ich den Wert übergeben habe aufgerufen wird und der Wert abgefragt wird, so ist er nicht mehr da.

Setze ich die Variable auf static geht es. Leider aber auch nur für einen User. Kann mir jemand helfen? Wie bekomme ich Werte von ausserhalb in ein Stateful-Bean ohne das die Werte verloren gehen, wenn das Bean passiv ist.

Ich hoffe ihr könnt mir helfen, denn ich bin total ratlos.
 
Gegenfrage: hast du EJB verstanden? Bzw. den unterschied zwischen Stateful und Stateless? Da scheint es an recht grundsätzlichem Wissen zu fehlen.

Stateful Beans halten clientspezifischen Zustand. D.h. wenn du von innerhalb der Bean Properties setzt, kannst du bei einem nächsten Request davon ausgehen, dass der Wert wieder da ist. Die Frage ist daher, wer in deinem Falle die den Setter aufrufende Instanz ist. Dieser ominöse jemand stellt vermutlich keinen "richtigen" Client dar und erhält somit irgendeine Beaninstanz aus dem Objektpool (Objektpooling ist eigentlich was aus Java 1.4 Zeiten, aber die meisten EJB Container machen sowas halt immer noch ^^ *grusel*).

Gruß
Ollie
 
Der Unterschied zwischen Stateful und Steles-Beans kenne ich, zumindest das was in dem Buch "Enterprise JavaBeans 3.0" steht.

Also möchte gerne, einen Wert, den ich in einem Stateful-Bean ermittel an ein anderes Stateful-Bean übergeben. Über die "@EJB"-Annotation binde ich das Local-Interface ein und benutze dann die setter-Methoden, aber wie gesagt wenn die Variable nicht static ist klappt das nicht.

ausschnitt aus meinem Code:
Code:
@Stateful
@Name("quellehdl") 
@Scope (ScopeType.SESSION)
public class QuelleHandler implements QuelleHandlerLocal { 
@EJB
    public CatalogStructureHandlerLocal cata;
//	------------------------------------------------------------------------------
	/**
	 * Methode zur Weiterleitung auf die Bearbeitenseite
	 */
	public String catalogStruk()	{
		Query query;
		String sql;
		Iterator iter;
		long catnum = -1;
		long catversnum = -1;
		
		sql = "select * from LOV_CATALOG where SOUR_SOUR_ID = ";
		sql+= selectedQuelle.getSourId();
		query = cmb.createNativeQuery(sql, "SelectCataMap");
		iter = query.getResultList().iterator();
		for(Object o : query.getResultList())
		{
			LOV_Catalog atr = (LOV_Catalog)iter.next();
			catnum = atr.getCataId();
		}
		
		if(catnum == -1)
		{
			facesMessages.add("Es konnte Satz in der LOV_CATALOG gefunden werden.");
			return "";
		}
		
		sql = "select * from LOV_CATALOG_VERSION where CATA_CATA_ID = ";
		sql+= catnum;
		query = cmb.createNativeQuery(sql, "SelectCatalogVersionMap");
		iter = query.getResultList().iterator();
		for(Object o : query.getResultList())
		{
			LOV_CatalogVersion atr = (LOV_CatalogVersion)iter.next();
			catversnum = atr.getCaveId();
		}
		
		if(catversnum == -1)
		{
			facesMessages.add("Es konnte kein Satz in der LOV_CATALOG_VERSION gefunden werden.");
			return "";
		}
		
		cata.setCatalogeS(null);
		cata.setSuchKezi((new Long(catversnum).toString()));
		cata.setSuchQuelle(selectedQuelle.getShortDesc());
		return "/pflege/LOV_CatalogStructure.xhtml";
	}
}

Und wenn die Seite dann angezeigt wird dann fehlt der Variablen-Inhalt in z.B. "suchKezi". Ausser ich mach die Variable static, aber das ist ja verboten.

Ich hoffe du kannst verstehen was ich meine?
 
Nö, verstehe ich nicht so richtig. Mal davon abgesehen dass das Denglisch furchtbar zu lesen ist und du - für den Fall, dass du Wert drauf legst, dass sich Leute durch deinen Code wühlen - den Code ruhig auf das Wesentliche beschränken könntest, verstehe ich nicht, was genau der setzende Aufruf auf der anderen Bean soll. Desweiteren gibt es hier gar keinen lesenden Aufruf zu der anderen Bean.

Desweiteren wimmelt es ja gerade nur so von designtechnischen Unzulänglichkeiten:

- SQL in der Geschäftslogik
- SQL per Stringkonkatenation (öffnet deinen Code komplett für SQL Injection)
- Abhängigkeiten zum Presentation Layer (das *.xhtml im return Statement)

Grundsätzlich stellt sich mir die Frage, warum du EJB benutzt, wenn du es dann nicht benutzt. Den Datenbankzugriff machst du komplett selbst, natives SQL usw.

Sorry, wenn ich das so verreiße, aber hier sieht man recht deutlich, dass jemand mit gefährlichem Halbwissen über eine Technologie um sich schlägt und hofft, die Nägel zu treffen auf die er es abgesehen hat.

Gruß
Ollie
 
Dem kann ich dir nur zustimmen. Leider hab ich aber keine andere Möglichkeit, da mir das Projekt einfach auf die Nase gedrückt wurde und mir bis auf ein paar Bücher nichts weiter zur Verfügung steht und der Termindruck enorm ist. Wenn das nicht mehr so stressig ist will ich das Projekt auch nach und nach umschreiben, aber ich musste halt irgendwie anfangen.

Also ich habe zwei Stateful Beans "bean1" und "bean2". in bean1 gibt es die Variable "var" die den Wert 5 hat. Nun möchte ich in bean1 auf bean2 zugreifen und dort die Variable "var2" den Wert von "var" aus bean1 geben

Ist das Möglich?
 
Das ist möglich, aber architektonisch nicht sinnvoll. Servicelayer sollten von grundauf möglichst stateless gehalten werden. So eine Stateful Session Bean macht dieses Konzept schonmal gehörig kaputt. Einzig halbwegs sinnvoller Weg aus deinem Problem ist IMHO deine Methode die in der anderen Bean benötigten Werte in ein Objekt gekapselt zurückgeben zu lassen und den Client (wer auch immer also deine Bean aufruft) den Call an die andere Bean machen zu lassen. So ist zumindest garantiert, dass du a) die richtige Instanz bekommst und b) du die Werte, die du vorher "setzen" wolltest einfach als Parameter übergeben kannst und du so einen (unspezifischen) Zustand in der 2. Bean vermeidest.

Gruß
Ollie
 

Neue Beiträge

Zurück