2 votes

Comment indiquer à Seam d'injecter une interface EJB locale (SLSB) et non l'interface EJB distante (SLSB) ?

J'utilise Seam avec JBoss AS. Dans mon application, j'ai un SLSB qui est également déclaré comme un composant Seam à l'aide de l'annotation @Name. J'essaie d'injecter et d'utiliser ce 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 s'exécute bien) et parfois Seam injecte l'interface distante (alors il y a une erreur dans l'exécution du code). J'ai essayé de faire tout ce qui est indiqué sur ce lien : http://docs.jboss.org/seam/2.2.0.GA/reference/en-US/html/configuration.html#config.integration.ejb.container

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 également 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 toutes les choses mentionnées ci-dessus, le filon continue parfois à injecter l'interface à distance. Est-ce que quelque chose m'échappe ici ? Quelqu'un peut-il me dire comment résoudre ce problème et dire au seam de toujours injecter l'interface locale ?

Mon fichier components.xml ressemble à ceci :

<?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="@puJndiName@"/>
  <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 à ça :

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

    public void doSomething() {

    }

}

7voto

Arthur Ronald Points 19001

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 apatride devrait ressembler à

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

     public void doSomething() {

     }

 }

Dans 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;

 }

0voto

@Arthur Ronald F D Garcia : Ma faute, j'ai ignoré une petite partie de la réponse que vous avez postée ci-dessus.

Dans mon application, j'avais les interfaces MyStatelessLocal et MyStatelessRemote, mais pas l'interface parent MyStateless. J'avais ajouté les méthodes abstraites dans les deux interfaces, locale et distante, et elles n'étaient pas vides.

Lorsque j'ai créé une interface parente MyStateless, que j'ai déplacé les méthodes abstraites de l'interface locale et distante vers l'interface parente (de sorte que les interfaces locale et distante soient vides), l'erreur a été résolue, et maintenant mon application fonctionne bien !

Merci beaucoup pour votre aide !

--Harshad Vyawahare.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X