Bonjour à tous,
C'est mon premier post, désolé si c'est pas au top. Merci d'avance de votre aide
Mon soucis est de na pas pouvoir déployer un EJB et de l'utiliser dans une application WEB. J'ai pourtant tester plusieurs solution, suivi plusieurs tuto ou démo de mise en place mais ça coince chez moi.
Environnement : NetBean 8.0.2 et Glassfish 4.1.13 pour application Maven JavaEE7, Primefaces 5.0
Afin de trouver la source du problème, j'ai réduite au minimum le code pour le reproduire, vous trouverez ici toutes les étapes. aucun autres fichiers n'a été modifié :
Etape 1: creation d'un projet Maven module EJB, galssfish 4.1, JavaEE7 'bugDeploiementEJB'
ITestBugEjb.java
package postbug.bugdeploiementejb;
public interface ITestBugEjb {
public String appelTestBugEjb();
}
ItestBugEjbLocal.java
package postbug.bugdeploiementejb;
import javax.ejb.Local;
@Local
public interface ITestBugEjbLocal extends ITestBugEjb {
}
IttestBugEjbRemote.java
package postbug.bugdeploiementejb;
import javax.ejb.Remote;
@Remote
public interface ITestBugEjbRemote extends ITestBugEjb {
}
testBugEjb.java
package postbug.bugdeploiementejb;
import java.io.Serializable;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
@Stateless (mappedName = "postbug.bugdeploiementejb")
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class TestBugEjb implements ITestBugEjbLocal, ITestBugEjbRemote, Serializable {
@Override
public String appelTestBugEjb() {
return ("Hello World !");
}
}
Etape 2 : création d'un projet Maven Web application, Framework JSF/ PrimeFaces 5.0
Création d'un bean : 'BeanTestAppelEJB.java'
package postbug.bugappelejb;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import postbug.bugdeploiementejb.ITestBugEjbLocal;
@ManagedBean
@ViewScoped
public class BeanTestAppelEJB {
private String monTexte;
@EJB (mappedName = "postbug.bugdeploiementejb")
private ITestBugEjbLocal texteEJB;
@PostConstruct
public void BeanTestAppelEJB() {
monTexte = texteEJB.appelTestBugEjb();
}
public String getMonTexte() {
return monTexte;
}
public void setMonTexte(String monTexte) {
this.monTexte = monTexte;
}
}
Modfication du code de la page : welcomePrimefaces.xhtml :
< p:layoutUnit position="center">
Welcome to PrimeFaces
<br/>
#{beanTestAppelEJB.monTexte}
</p:layoutUnit>
Etape 3 : test de la dépendance.
==> si j'ajoute la dépendance scope "compile", type "jar". Cela fonctionne OK
==> si je déploye l'EJB et que j'ajoute la dépendance scope "provided" et type "ejb", c'est là que ça ne fonctionne plus. Cf la log Glassfish à l'exécution de l'application Web (je ne pets pas tout pour le moment) :
Infos: visiting unvisited references
Infos: visiting unvisited references
Grave: Class [ Lpostbug/bugdeploiementejb/ITestBugEjbLocal; ] not found. Error while loading [ class postbug.bugappelejb.BeanTestAppelEJB ]
Infos: visiting unvisited references
Infos: visiting unvisited references
Infos: Initialisation de Mojarra 2.2.7 ( 20140610-1547 https://svn.java.net/svn/mojarra~svn/tags/2.2.7@13362) pour le contexte «/bugAppelEJB2»
Grave: Critical error during deployment:
java.lang.NoClassDefFoundError: Lpostbug/bugdeploiementejb/ITestBugEjbLocal;
at java.lang.Class.getDeclaredFields0(Native Method)
at java.lang.Class.privateGetDeclaredFields(Class.java:2570)
at java.lang.Class.getDeclaredFields(Class.java:1903)
Caused by: java.lang.ClassNotFoundException: postbug.bugdeploiementejb.ITestBugEjbLocal
at org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1783)
at org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1633)
... 76 more
Grave: Startup of context /bugAppelEJB2 failed due to previous errors
Grave: Exception during cleanup after start failed
org.apache.catalina.LifecycleException: Manager has not yet been started
at org.apache.catalina.session.StandardManager.stop(StandardManager.java:935)
at org.apache.catalina.core.StandardContext.stop(StandardContext.java:6133)
at com.sun.enterprise.web.WebModule.stop(WebModule.java:720)
Grave: ContainerBase.addChild: start:
org.apache.catalina.LifecycleException: java.lang.RuntimeException: java.lang.NoClassDefFoundError: Lpostbug/bugdeploiementejb/ITestBugEjbLocal;
at org.apache.catalina.core.StandardContext.start(StandardContext.java:5954)
at com.sun.enterprise.web.WebModule.start(WebModule.java:691)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:1041)
Caused by: java.lang.RuntimeException: java.lang.NoClassDefFoundError: Lpostbug/bugdeploiementejb/ITestBugEjbLocal;
at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:280)
at org.apache.catalina.core.StandardContext.contextListenerStart(StandardContext.java:5394)
Caused by: java.lang.NoClassDefFoundError: Lpostbug/bugdeploiementejb/ITestBugEjbLocal;
at java.lang.Class.getDeclaredFields0(Native Method)
at java.lang.Class.privateGetDeclaredFields(Class.java:2570)
Avertissement: java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: java.lang.RuntimeException: java.lang.NoClassDefFoundError: Lpostbug/bugdeploiementejb/ITestBugEjbLocal;
java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: java.lang.RuntimeException: java.lang.NoClassDefFoundError: Lpostbug/bugdeploiementejb/ITestBugEjbLocal;
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:1044)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:1024)
Grave: Exception while invoking class com.sun.enterprise.web.WebApplication start method
java.lang.Exception: java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: java.lang.RuntimeException: java.lang.NoClassDefFoundError: Lpostbug/bugdeploiementejb/ITestBugEjbLocal;
at com.sun.enterprise.web.WebApplication.start(WebApplication.java:168)
at org.glassfish.internal.data.EngineRef.start(EngineRef.java:122)
Grave: Exception during lifecycle processing
java.lang.Exception: java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: java.lang.RuntimeException: java.lang.NoClassDefFoundError: Lpostbug/bugdeploiementejb/ITestBugEjbLocal;
at com.sun.enterprise.web.WebApplication.start(WebApplication.java:168)
at org.glassfish.internal.data.EngineRef.start(EngineRef.java:122)
Grave: Exception while loading the app
Grave: Undeployment failed for context /bugAppelEJB2
Grave: Exception while loading the app : java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: java.lang.RuntimeException: java.lang.NoClassDefFoundError: Lpostbug/bugdeploiementejb/ITestBugEjbLocal;
Pouvez-vous m'aider à trouver la raison de cette erreur ?
D'autre part, étant débutant, je profite de ce soucis pour vous demander comment savoir si deux application tourne sur une même JVM, et s'il faut utiliser l'interface "Local" ou plutôt "Remote" pour déclarer et utiliser un EJB ? Est-ce dans mon exemple le cas de l'interface Local est judicieuses ?
Encore merci de votre aide.
A votre disposition si besoin d'informations complémentaires.
Partager