ejb3.0 jboss 4.0.4 problem

juliab1984

Grünschnabel
hallo,

wir versuchen gerade eine ejb3 anwendung zu programmieren (bis 31. januar muss es fertig werden - die zeit wird knapp!). als server verwenden wir jboss 4.0.4. mit der standard hypesonic-datenbank.
im moment haben wir aber ein ganz schön blödes problem und keine ahnung wie wir es beheben sollen: wir haben keine verbindung zur datenbank.

unsere persistence.xml sieht so aus:

Code:
<?xml version="1.0" encoding="UTF-8"?>
<persistence>
   <persistence-unit name="fho-middleware">
    <jta-data-source>java:/DefaultDS</jta-data-source>
    <properties>
        <property name="hibernate.hbm2ddl.auto" value="update"/>
    </properties>
    </persistence-unit>
</persistence>
in der datei haben wir nichts außer dem namen geändert. die restlichen einstellungen sind alle von der cd von dem buch enterprise javabeans 3.0 von uwe rozanski. leider steht nichts weiter dabei, es kommt uns sovor als sollte es eigentlich standardmäßig von alleine gehen.

unsere fehlermeldungen beim deployen sehen so:

Code:
--- MBeans waiting for other MBeans ---
ObjectName: persistence.units:jar=server.jar,unitName=fho-middleware
  State: FAILED
  Reason: java.lang.NullPointerException
  I Depend On:
    jboss.jca:service=ManagedConnectionFactory,name=DefaultDS
  Depends On Me:
    jboss.j2ee:jar=server.jar,name=PlayersVerwaltungBean,service=EJB3

ObjectName: jboss.j2ee:jar=server.jar,name=PlayersVerwaltungBean,service=EJB3
  State: NOTYETINSTALLED
  I Depend On:
    persistence.units:jar=server.jar,unitName=fho-middleware

ObjectName: jboss.j2ee:jar=server.jar,name=GameSettingsVerwaltungBean,service=EJB3
  State: NOTYETINSTALLED
  I Depend On:
    persistence.units:unitName=JavaEE

--- MBEANS THAT ARE THE ROOT CAUSE OF THE PROBLEM ---
ObjectName: persistence.units:jar=server.jar,unitName=fho-middleware
  State: FAILED
  Reason: java.lang.NullPointerException
  I Depend On:
    jboss.jca:service=ManagedConnectionFactory,name=DefaultDS
  Depends On Me:
    jboss.j2ee:jar=server.jar,name=PlayersVerwaltungBean,service=EJB3

ObjectName: persistence.units:unitName=JavaEE
  State: NOTYETINSTALLED
  Depends On Me:
    jboss.j2ee:jar=server.jar,name=GameSettingsVerwaltungBean,service=EJB3
weiß jemand woran es liegen könnte? braucht ihr mehr infos? es wäre super nett, wenn uns jemand weiterhelfen würde...

viele grüße, julia
 
Kann es sein, dass ihr in GameSettingsVerwaltungBean einen falschen PersitenceContext nutzt? Das Log sagt, dass die Bean auf die unit JavaEE verweist, ihr habt aber nur eine fho-middleware deklariert.

Kannst du die annotierten Teile der SessionBeans vielleicht noch mal posten?

Gruß
Ollie
 
guten morgen!

echt nett, dass ihr/du so schnell geantwortet habt, aber nach ner endlosen nachtschicht sind wir mit den nerven am ende und werden wir jetzt einfach die entity beans rauswerfen und ganz normal jdbc benutzen.

aber danke für die gedanken die an uns verschwendet wurden!

viele grüße, julia
 
*zwinker* da tauscht ihr aber Pest gegen Cholera ;) Ausserdem macht doch die SessionBean Probleme, nicht die Entity ;)

Gruß
Ollie

PS: kannst du die Frage vielleicht trotzdem wieder als "offen" deklarieren? Sonsts meint vielleicht jemand mit ähnlichem Problem, er könne hier ne Lösung finden ;)
 
Zuletzt bearbeitet:
die session bean? die hat gar nix damit zu tun? zumindest meiner meinung nach! wohl eher die application bean. unsere session bean nimmt nur befehle von jsp an und greift auf die application bean zu. gar nix mit db...

guckst du? wenn das jetzt schnell zu fixen wäre könnt ich mir sparen die queries heute mittag zu machen...

Code:
package ejb.server;

import javax.ejb.Stateful;
import javax.ejb.Remove;

@Stateful
public class SessionBean implements SessionRemote {	
	public String username;
	public int playerID;
	public int gameID;
	public int myValue;
	public ApplicationBean ab = new ApplicationBean(this.playerID, this.gameID);
	
	@Remove(retainIfException=true)
	public void remove()
	{
	}
	
	//Weitergeben
	public void nextOne() {
		ab.defineValue(this.playerID, this.myValue, false); //letzter Parameter: aufgedeckt
		this.generateGamelogString(this.username, ab.getValue(this.playerID));
	}
	
	//Aufdecken
	public void uncover() {
		ab.defineValue(this.playerID, this.myValue, true); //eingestellter Wert wird hier uebergeben, es muss aber Wuerfelwert aus DB ausgelesen werden
	}
	
	//Login
	public void setUsername(String name)
	{
		this.username = name;
	}
	
	public String getUsername()
	{
		ApplicationBean ab0 = new ApplicationBean();
		return ab0.getUsername(1);//return this.username;
	}
	
	//Login
	public void createPlayer() //erzeugt neuen Spieler und speichert playerID/gameID in Session
	{ 
		ApplicationBean ab0 = new ApplicationBean();
		this.playerID = ab0.addPlayer("walter");//(this.getUsername());
		this.gameID = 1;//ab0.getActualGame();
		ab0.remove();
	}
	
	//Wuerfeln
	public int getWuerfel()
	{
		int ergebnis;
		
		ergebnis = ab.wuerfeln(); 
		
		return ergebnis;
	}
	
	public void setValue(int value) 
	{
		this.myValue = value;
	}
	
	public boolean getTurn() //true, falls Spieler am Zug, sonst false (ApplicationBean verwaltet die Reihenfolge der Teilnehmer)
	{
		boolean turn;
		
		turn = ab.myTurn();
		
		return turn;
	} 
	public int getScore() //gibt Score eines Spielers aus (ApplicationBean; dazu Spieler-ID übergeben, mit der Spieler bei ApplicationBean registriert ist)
	{
		int score;
		
		score = ab.getScore(this.playerID); 
			
		return score;
	} 
		
	public void generateGamelogString(String name, int value)
	{
		String glString;
		
		switch (value) {
			case 31:
				glString = name + " hat " + value + " &uuml;bergeben.";
				break;
			case 32:
				glString = name + " hat " + value + " &uuml;bergeben.";
				break;
			case 41:
				glString = name + " hat " + value + " &uuml;bergeben.";
				break;
			case 42:
				glString = name + " hat " + value + " &uuml;bergeben.";
				break;
			case 43:
				glString = name + " hat " + value + " &uuml;bergeben.";
				break;
			case 51:
				glString = name + " hat " + value + " &uuml;bergeben.";
				break;
			case 52:
				glString = name + " hat " + value + " &uuml;bergeben.";
				break;
			case 53:
				glString = name + " hat " + value + " &uuml;bergeben.";
				break;
			case 54:
				glString = name + " hat " + value + " &uuml;bergeben.";
				break;
			case 61:
				glString = name + " hat " + value + " &uuml;bergeben.";
				break;
			case 62:
				glString = name + " hat " + value + " &uuml;bergeben.";
				break;
			case 63:
				glString = name + " hat " + value + " &uuml;bergeben.";
				break;
			case 64:
				glString = name + " hat " + value + " &uuml;bergeben.";
				break;
			case 65:
				glString = name + " hat " + value + " &uuml;bergeben.";
				break;
			case 11:
				glString = name + " hat Einser-Pasch &uuml;bergeben.";
				break;
			case 22:
				glString = name + " hat Zweier-Pasch &uuml;bergeben.";
				break;
			case 33:
				glString = name + " hat Dreier-Pasch &uuml;bergeben.";
				break;
			case 44:
				glString = name + " hat Vierer-Pasch &uuml;bergeben.";
				break;
			case 55:
				glString = name + " hat F&uuml;nfer-Pasch &uuml;bergeben.";
				break;
			case 66:
				glString = name + " hat Sechser-Pasch &uuml;bergeben.";
				break;
			case 21:
				glString = name + " hat M&auml;xle gew&uuml;rfelt!";
				break;
			case 0:
				glString = name + " hat aufgedeckt und verloren.";
				break;
			case 1:
				glString = name + " hat aufgedeckt und gewonnen.";
				break;
			default: 
				glString = "Fehler bei der &Uuml;bergabe";//Exception				
		}
		this.addToGamelog(glString);
	}
	
	public void addToGamelog(String addString) //fuegt addString dem aktuellen Gamelog-String hinzu und uebergibt ihn ApplicationBean
	{		
		ab.setGamelog(addString);		
	} 
	
	public String getGamelog() //gibt aktuellen Gamelog-String zurueck
	{
		String gamelog;
		
		gamelog = ab.getGamelog();
		
		return gamelog;
		
	} 
	
	/*public int submitValue(int diceA, int diceB) //generiert aus den beiden Wuerfeln den Gesamtwert und uebergibt ihn an ApplicationBean
	{
		int submitValue;
		
		if(diceA >= diceB)
		{
			submitValue = 10 * diceA + diceB; 
		}
		
		else
		{
			submitValue = 10 * diceB + diceA;
		}
		
		ab.setValue(this.playerID, submitValue);
		
		return submitValue;
	} */
	
	//am Zug
	public int getPredecessorValue() //gibt den Wert des unmittelbaren Vorgaengers aus (ApplicationBean verwaltet die Reihenfolge der Teilnehmer)
	{
		int opponentValue;
		
		opponentValue = ab.getPredecessorValue();
		
		return opponentValue;
	} 
	
	//Timerablauf + Logout
	public void inactivePlayer() //wird nach clientseitigem Timerablauf und beim Logout aufgerufen und fordert ApplicationBean auf, beim naechsten Spieler ein neues Spiel zu beginnen + Punktabzug aktueller Spieler
	{
		ab.inactivePlayer(this.playerID);
	}
	
	public int getPartCount() //ruft entsprechende Methode aus ApplicationBean auf und gibt Anzahl der Teilnehmer zurueck
	{
		return ab.getPartCount(this.gameID); 
	}
	
}

soll übrigens mäxle werden, wenns groß ist...

grüßlis
 
Huiuiui, das sieht aber arg nach Kraut und Rüben aus. Scheint, als hättet ihr da viel Grundsäzliches noch nicht verstanden. Was immer auch ApplicationBean ist - Dependencies sollten injected werden. Selbst instantiieren ist nicht gut in dem Fall.

ApplicationBean scheint mir eine Fassade für nen EntityManager zu sein? Da eure Klassenbenamung auch sehr unsprechend ist, fällt es schwer zu deuten, was ihr da vor habt.

Normalerweise läuft das im Groben so: SessionBeans (egal ob stateful oder stateless) bekommen per @PersistenceContext einen (JPA)EntityManager injected, mitdem man Objekte persistieren kann, die mit JPA Annotations (@Entity usw.) annotiert sind. Referenzen auf weitere SessionBeans sollte man sich mit @EJB injecten lassen.

Von diesem Vorgehensmodell kann ich so unheimlich gar nix bei eurem Code entdecken, bis auf ein @Stateful (warum eigentlich nicht @Stateless?). ;)

Zurück zum Ausgangsproblem: du deklarierst in der persistence.xml eine persistenceUnit fho-middleware. Laut stacktrace:

Code:
ObjectName: jboss.j2ee:jar=server.jar,name=GameSettingsVerwaltungBean,service=EJB3
  State: NOTYETINSTALLED
  I Depend On:
    persistence.units:unitName=JavaEE

referenziert eure GameSettingsVerwaltungBean (die man, wenn ich das oben beschriebene Vorgehensmodell vorraussetze, wohl als SessionBean implementieren würde - daher meine Frage) eine persistenceUnit namens JavaEE. Wo kommt die her?

Plain JDBC ist in nem ApplicationServer auch nicht ohne. Da kann man ne Menge falsch machen, grad was das Resourcenhandling bzw. ExceptionHandling angeht. Ausserdem stellt sich dann die Frage, warum ihr überhaupt einen AS braucht.

Wenn du mich fragst, macht es mehr Sinn, die EJB Implementierung gerade zu ziehen.

Gruß
Ollie
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück