2010-04-27 15 views
2

J'utilise Seam avec JBoss AS. Dans mon application, j'ai un SLSB qui est également déclaré comme un composant de couture en utilisant l'annotation @Name. J'essaie d'injecter et d'utiliser cette SLSB dans un autre composant de couture en utilisant l'annotation @In. Mon problème est que parfois Seam injecte l'interface locale (alors le code fonctionne bien) et parfois la couture injecte l'interface distante (alors il y a une erreur dans l'exécution du code). Je l'ai essayé de faire toutes les choses spécifiées sur ce lien: http://docs.jboss.org/seam/2.2.0.GA/reference/en-US/html/configuration.html#config.integration.ejb.containerComment indiquer à Seam d'injecter une interface EJB locale (SLSB) et non l'interface EJB distante (SLSB)?

Le SeamInterceptor est configuré,
j'ai spécifié le modèle JNDI dans le fichier components.xml (< core: init debug = "true" jndi-pattern = » earName/# {ejbName}/local "/>),
J'ai également essayé d'utiliser l'annotation @JndiName (" earName/ejbName/local ") pour chaque SLSB,
J'ai essayé de définir cette propriété (org.jboss. seam.core.init.jndiPattern = earName/# {ejbName}/local) dans le fichier seam.properties.
J'ai aussi essayé de mettre le texte ci-dessous dans le fichier web.xml

<context-param> 
    <param-name>org.jboss.seam.core.init.jndiPattern</param-name> 
    <param-value>earName/#{ejbName}/local</param-value> 
</context-param> 

Même après avoir fait tout ce qui précède mentionné les choses, la couture injecte encore l'interface distante parfois. Est-ce que j'ai râté quelque chose? Quelqu'un peut-il me dire comment résoudre ce problème et dire à seam de toujours injecter l'interface locale?

Mon fichier components.xml ressemble:

<?xml version="1.0" encoding="UTF-8"?> 
<components xmlns="http://jboss.com/products/seam/components" 
     xmlns:core="http://jboss.com/products/seam/core" 
     xmlns:persistence="http://jboss.com/products/seam/persistence" 
     xmlns:drools="http://jboss.com/products/seam/drools" 
     xmlns:bpm="http://jboss.com/products/seam/bpm" 
     xmlns:security="http://jboss.com/products/seam/security" 
     xmlns:mail="http://jboss.com/products/seam/mail" 
     xmlns:web="http://jboss.com/products/seam/web" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation= 
      "http://jboss.com/products/seam/core http://jboss.com/products/seam/core-2.1.xsd 
      http://jboss.com/products/seam/persistence http://jboss.com/products/seam/persistence-2.1.xsd 
      http://jboss.com/products/seam/drools http://jboss.com/products/seam/drools-2.1.xsd 
      http://jboss.com/products/seam/bpm http://jboss.com/products/seam/bpm-2.1.xsd 
      http://jboss.com/products/seam/security http://jboss.com/products/seam/security-2.1.xsd 
      http://jboss.com/products/seam/mail http://jboss.com/products/seam/mail-2.1.xsd 
      http://jboss.com/products/seam/web http://jboss.com/products/seam/web-2.1.xsd 
      http://jboss.com/products/seam/components http://jboss.com/products/seam/components-2.1.xsd"> 
    <core:init debug="true" jndi-pattern="myEarName/#{ejbName}/local"/> 
    <core:manager concurrent-request-timeout="500" 
      conversation-timeout="120000" 
      conversation-id-parameter="cid" 
      parent-conversation-id-parameter="pid"/> 
    <web:hot-deploy-filter url-pattern="*.seam"/> 
    <persistence:managed-persistence-context name="entityManager" auto-create="true" 
        persistence-unit-jndi-name="@[email protected]"/> 
    <drools:rule-base name="securityRules"> 
    <drools:rule-files> 
     <value>/security.drl</value> 
    </drools:rule-files> 
    </drools:rule-base> 
    <security:rule-based-permission-resolver security-rules="#{securityRules}"/> 
    <security:identity authenticate-method="#{authenticator.authenticate}" remember-me="true"/> 
    <event type="org.jboss.seam.security.notLoggedIn"> 
    <action execute="#{redirect.captureCurrentView}"/> 
    </event> 
    <event type="org.jboss.seam.security.loginSuccessful"> 
    <action execute="#{redirect.returnToCapturedView}"/> 
    </event> 
    <component name="org.jboss.seam.core.init"> 
    <property name="jndiPattern">myEarName/#{ejbName}/local</property> 
    </component> 
</components> 

Et mon composant EJB ressemble:

 

@Stateless 
@Name("myEJBComponent") 
@AutoCreate 
public class MyEJBComponentImpl implements MyEJBComponentRemote, MyEJBComponentLocal { 

    public void doSomething() { 

    } 

} 

 
+0

J'ai vérifié les journaux jboss, j'ai observé cette ligne dans le fichier journal: DEBUG [org.jboss.seam.Component] (main) org.jboss.seam.core.init.jndiPattern = myEarName/# {ejbName}/local, Le jndiPattern est configuré correctement. –

+0

V Il semble juste! Essayez le suivant: ** supprimez l'interface distante ** et voyez si votre application fonctionne bien. Sinon, montrez votre pileTrace. Si possible, faites sans annotation AutoCreate. –

+0

@Arthur Ronald F D Garcia: Ok, j'ai supprimé l'annotation AutoCreate et l'ai remplacé par @In (create = true). J'ai enlevé toutes mes interfaces à distance, et j'ai lancé l'application 6 fois (parce que même avec l'interface à distance, l'application marche bien parfois), ça s'est bien passé toutes les 6 fois. Je pense qu'avec l'interface à distance enlevée, la couture ne se confond pas, quelle interface utiliser, locale ou distante. –

Répondre

7

Je suppose que le suivant

public interface MyStateless { 

    void doSomething();   

} 

/** 
    * Be aware you CAN NOT USE @Local and @Remote at the same time 
    */ 

@Local 
public interface MyStatelessLocal extends MyStateless {} 

@Remote 
public interface MyStatelessRemote extends MyStateless {} 

Votre Sho sans état ULD ressemble

/** 
    * Global JNDI address will be earName/MyStatelessImpl/local and earName/MyStatelessImpl/remote 
    */ 
@Stateless 
@Name("myStateless") 
public class MyStatelessImpl implements MyStatelessLocal, MyStatelessRemote { 

    public void doSomething() { 

    } 

} 

l'intérieur de votre composant Seam

@Name("otherSeamComponent") 
public class OtherSeamComponent { 

    /** 
     * Seam will lookup a Seam Component by field name - myStateless 
     * 
     * Notice i am using the local interface 
     */ 
    private @In MyStatelessLocal myStateless; 

} 
+0

Arthur, Merci pour la réponse détaillée, mais je fais exactement la même chose que vous avez mentionné, mais je suis confronté à la question. –

+0

@Harshad V Alors j'ai besoin de vous montrer à quoi ressemble votre application: */WEB-INF/components.xml *, votre composant EJB, voir http://stackoverflow.com/questions/2453746/jboss-seam-enabling-debug -page-on-weblogic-10-3-2-11g/2459795 # 2459795 comment devrait ressembler votre application. Quel serveur App utilisez-vous? –

+0

J'utilise JBoss 5.1.0.GA App serveur. J'ai vérifié le lien que vous avez fourni, mon application ressemble à celle indiquée sur le lien, sauf qu'il n'y a pas de dossier lib dans le dossier myapp-ejb.jar et le dossier lib du dossier myapp-war.war se trouve dans le dossier WEB-INF , c'est-à-dire myapp-war.war \ WEB-INF \ lib. J'ai modifié ma question ci-dessus et ajouté mon component.xml et le composant EJB. –

0

@Arthur Ronald F D Garcia: Mon mauvais, je l'ai ignoré une petite partie de la réponse que vous avez affichée ci-dessus.

Dans mon application, j'avais les interfaces MyStatelessLocal et MyStatelessRemote, mais je n'avais pas l'interface parent MyStateless. J'avais ajouté les méthodes abstraites dans les interfaces locales et distantes, et elles n'étaient pas vides. Lorsque j'ai créé une interface parent MyStateless, j'ai déplacé les méthodes abstraites de l'interface locale et distante vers l'interface parent (afin que les interfaces locales et distantes soient vides), l'erreur a été résolue et maintenant mon application fonctionne correctement. !

Merci beaucoup pour votre aide!

--Harshad Vyawahare.