2010-03-05 7 views
2

Mon élément SFSB Seam est lié à JNDI sur le déploiement, comme en témoigne ce message du journal:JBoss Seam: composant installé dans le JNDI, l'accès des composants ne dit pas Bound

Component: example, scope: CONVERSATION, type: STATEFUL_SESSION_BEAN, 
class:com.purecharger.action.ExampleAction, JNDI: purecharger/ExampleAction/local 

Mon interface:

@Local 
public interface Example {  
    public List<String> getExample(); 
    public void destroy(); 
} 

et ma mise en œuvre:

@Stateful 
@Scope(ScopeType.CONVERSATION) 
@Name("example") 
@Restrict("#{identity.loggedIn}") 
public class ExampleAction implements Example, Serializable { 

    .... 
} 

Cependant, quand j'accéder au composant voting dans un xh Page TML comme, je reçois l'erreur suivante:

javax.el.ELException: /home.xhtml: Could not instantiate Seam component: example 
.... 
Caused by: javax.naming.NameNotFoundException: ExampleAction not bound 

Si Seam était assez intelligent pour installer mon composant en utilisant le modèle JNDI dans components.xml (purecharger/#{ejbName}/local), pourquoi ne pas appliquer aussi le modèle lors de la recherche des composants ?

Merci.

MISE À JOUR: En regardant le JNDIView dans JBoss, le nom purecharger/ExampleAction/local est pas lié partout. Donc, je suppose que ma question devient maintenant, pourquoi Seam ne pas ajouter cette SFSB à JNDI?

Répondre

1

Why is Seam not adding this SFSB to JNDI ?

Eh bien,

Comme le montre votre question, je pense que vous avez une application de l'oreille, à cause de son adresse globale JNDI

purecharger/ExampleAction/local 

qui est mis en correspondance selon

<EAR_APPLICATION>/<STATEFUL_BEAN>/local 

Lorsque vous déployez un seul module EJB, son adresse globale JNDI dans JBoss ressemble à

<STATEFUL_BEAN>/local 

Bacause vous avez une application de l'oreille, chaque module EJB doit être déclaré dans application.xml (Le fichier qui décrit votre oreille) comme suit

donc votre application de l'oreille ressemble

pureCharger.ear 

    META-INF 
     application.xml 
    pureCharger-ejb.jar 
    pureCharger-war.war 
    jboss-seam.jar 
    lib 
     // libraries shared by your modules goes here 

Et votre application.xml

<?xml version="1.0" encoding="UTF-8"?> 
<application version="5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_5.xsd"> 
    <display-name>pureCharger</display-name> 
    <module> 
     <ejb>pureCharger-ejb.jar</ejb> 
    </module> 
    <module> 
     <ejb>jboss-seam.jar</ejb> 
    </module> 
    <module> 
     <web> 
      <web-uri>pureCharger-war.war</web-uri> 
      <context-root>pureCharger</context-root> 
     </web> 
    </module> 
</application> 

Avis jboss-se am.jar est un module EJB, il doit donc également être déclaré dans le fichier application.xml

Si possible, utilisez Seam-gen pour générer votre projet. Il prend en charge toutes les bibliothèques nécessaires à votre projet et peut être ouvert sans restriction dans NetBeans, par exemple.

salutations,

+0

Merci Arthur, c'était le problème. Non seulement je n'ai pas déclaré mon fichier EJB dans application.xml, mais j'essayais aussi de l'avoir en live dans war/WEB-INF/lib, ce qui n'est pas correct (au moins jusqu'à la version v3.1 de la spécification EJB). – purecharger