# EJB Frage



## sirius76 (14. Dez 2011)

liebe Community

Anbei ein problem welches ich nicht verstehe warum es nicht funktioniert.

Hier meine SessionBean mit Namen CalculatorRemoteImpl

```
package unter;

import javax.ejb.Stateless;

@Stateless(name="CalculatorRemote", mappedName="demo.business.CalculatorRemoteJNDI") 
public class CalculatorRemoteImpl implements CalculatorRemote{
	
	public int add(int wertx, int werty) {
		return wertx + werty;
	}
}
```

Die Schnittstelle mit Namen CalculatorRemote

```
package unter;

import javax.ejb.Remote;

@Remote
public interface CalculatorRemote {
	public int add(int wert1, int wert2);
}
```

und hier mein Client welcher funktioniert:

```
package ett;

import javax.naming.InitialContext;

import unter.CalculatorRemote;

public class Client {

	public static void main(String[] args) throws Exception{
	      InitialContext context = new InitialContext();
	      CalculatorRemote calculator = (CalculatorRemote) context.lookup("demo.business.CalculatorRemoteJNDI");
	      System.out.println("Resultat: " + calculator.add(9, 5));
	}

}
```
Ausgabe ist Resultat : 14


Aber wenn ich das selbe beim Client mit Dependency Incjection versuche also mit

```
package ett;
import javax.ejb.EJB;
import unter.CalculatorRemote;

public class Client2 {
	
	@EJB 
	public CalculatorRemote calculator;
	
	public void business(){
		System.out.println("Resultat: " + calculator.add(9, 5));
		
	}

	public static void main(String[] args) throws Exception{
		 Client2 obj = new Client2();
		 obj.business();

	}
}
```

erhalte ich die Fehlermeldung:
Exception in thread "main" java.lang.NullPointerException
	at ett.Client2.business(Client2.java:11)
	at ett.Client2.main(Client2.java:17)


Ich bin schon ewig lange dran und finde den Fehler nicht. Habt ihr eine Idee ? Ich würde mich sehr freuen für eure Hilfe.

Schoenen tag.


----------



## nocturne (14. Dez 2011)

Das liegt daran dass dein Client kein Server hat.

Entweder du installierst auf deinem Client einen Server, oder du verzichtest auf DI.


----------



## sirius76 (14. Dez 2011)

sorry das versteh icj hetzt überhaupt nicht was du meinst. wieso benötigt ein client einen Server ?
auf meinem PC habe ich glassfish installiert und auf meinem pc ist dieser code abgelegt und auf dem applikationserver deployt.
hat jemand eine andere idee warum diese fehlermeldung kommt. vorallem ist es ein beispiel aus einem buch für ejb einsteiger, also ein beispiel dass eigentlich funktionieren soll.

danke euch


----------



## TheDarkRose (14. Dez 2011)

Auf einem Client ist keine Dependency Injection möglich, da in der JRE kein EJB-Container vorhanden ist. Du musst per JNDI/Corba auf den Server zugreifen. Ausnahme wäre, wenn du den Client mit der EAR in den Glassfish deployst und über den Glasfish Webstartlink diesen startest, dann sollte das gehen.
An Eclipse / GlassFish / Java EE 6 Tutorial » Programming


----------



## Sym (15. Dez 2011)

Wenn er das als EAR verpackt (oder in einem WAR WebProfile) dann muss das aber keine Remote Bean sein, es sei denn, es gibt noch andere Clients.


----------



## TheDarkRose (15. Dez 2011)

Doch, da der Client ja dann Remote gestartet wird und nicht am Server.


----------



## Sym (15. Dez 2011)

Wie, der wird Remote gestartet? Ich dachte, der soll jetzt mit ins EAR auf den Glassfish? Oder habe ich Dich falsch verstanden?


----------



## TheDarkRose (15. Dez 2011)

Jap. Glassfish Webstart Feature


----------



## Sym (16. Dez 2011)

Ah jo, danke... 

Zu doof zum Lesen.


----------



## nocturne (16. Dez 2011)

Das unverständniss ist nicht ganz ungerechtfertigt.

Es sollte doch kein Problem sein für sirus einen classloader abzuleiten der die felder besetzt.... Macht das mal jeamand?


----------



## FArt (19. Dez 2011)

@EJB lässt sich laut Spec nur in anderen EJBs oder in Servlets nutzen, nicht in POJOs.
Wenn du CDI verwenden möchtest, also DI auch für POJOs, musst du @Inject verwenden und das klappt auch außerhalb eines EE Containers.


----------

