Bonjour,
Bon, je n'ai pas testé moi-même, mais je peux voir à partir de ton code d'où vient le problème. A vrai dire, je ne suis pas très certain que le code fonctionne quand l'ejb est stateless (c'est vraiment le cas?).
Le problème c'est que dans ta servlet, tu instancies directement ton bean (rCalcul = new CalculBean()), dès lors le container n'a aucune prise sur cette instanciation et ne peut donc pas faire l'injection pour toi avant tout appel de méthode. D'où le NullPointerException. C'est pour ça que la seule façon qui te reste dans ce cas pour avoir une instance de l'ejb c'est de passer par un lookup JNDI.
Pour que l'injection fonctionne de bout en bout, il te faudrait aussi injecter le bean CalculBean dans la servlet:
@Inject private CalculBean rCalcul;
Mais à partir de là, il va falloir commencer à faire attention au scope de ton bean, qui par défaut est @Dependent. Etant donné qu'il n'y a qu'une seule instance de la servlet durant toute la durée de l'application, l'instance de ton ejb stateful injectée par cdi risquerait de durer jusqu'à la fermeture de l'application. Ce qui en général n'est pas ce qu'on veut.
Il faudrait donc définir un scope pour le bean (@RequestScoped par exemple):
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
package metier;
import javax.enterprise.context.RequestScoped;
import pkgCalcul.*;
@RequestScoped
public class CalculBean {
private float _nb1, _nb2, _resultat;
private int _operation;
@EJB(mappedName="CalculerRemote")
private CalculerRemote unCalcul;
...
} |
Bon, il y a encore quelques trucs à redire sur ton code, comme par exemple le fait que tu n'aies peut-être pas besoin d'interface remote pour ton ejb, une interface locale étant suffisante et moins coûteuse en termes de performance, etc.
Mais je pense que les quelques changements suggérés ci-dessus devraient suffir pour t'aider à y voir plus clair par rapport à ce que fait le container.
Partager