Как сообщить Seam о внедрении локального интерфейса EJB (SLSB), а не удаленного интерфейса EJB (SLSB)?

Я использую Seam с JBoss AS. В моем приложении у меня есть SLSB, который также объявлен как компонент шва с использованием аннотации @Name. Я пытаюсь ввести и использовать этот SLSB в другом компоненте шва, используя аннотацию @In.

Моя проблема в том, что иногда Seam вводит локальный интерфейс (тогда код работает нормально), а иногда seam вводит удаленный интерфейс (тогда возникает ошибка при выполнении кода). Я пробовал делать все, что указано в этой ссылке: http://docs.jboss.org/seam/2.2.0.GA/reference/en-US/html/configuration.html#config.integration.ejb.container < / а>

SeamInterceptor настроен,
я указал шаблон jndi в файле components.xml (‹core: init debug =" true "jndi-pattern =" earName / # {ejbName} / local "/>),
Я также пробовал использовать аннотацию @JndiName ("earName / ejbName / local") для каждого SLSB,
Я пробовал установить это свойство (org.jboss.seam.core.init.jndiPattern = earName / # {ejbName} / local) в файле seam.properties.
Я также попытался поместить приведенный ниже текст в файл web.xml.

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

Даже после выполнения всех вышеупомянутых действий шов все еще иногда вводит удаленный интерфейс. Я что-то упустил? Может ли кто-нибудь сказать мне, как решить эту проблему и сказать шову, чтобы он всегда вставлял локальный интерфейс?

Мой файл components.xml выглядит так:

<?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>

А мой компонент EJB выглядит так:


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

    public void doSomething() {

    }

}



person Harshad Vyawahare    schedule 27.04.2010    source источник
comment
Я проверил журналы jboss, я заметил эту строку в файле журнала: DEBUG [org.jboss.seam.Component] (main) org.jboss.seam.core.init.jndiPattern = myEarName / # {ejbName} / local, The jndiPattern устанавливается правильно.   -  person Harshad Vyawahare    schedule 28.04.2010
comment
V Кажется, правильно! Попробуйте сделать следующее: удалите удаленный интерфейс и посмотрите, нормально ли работает ваше приложение. Если нет, покажите свой stackTrace. По возможности обойтись без аннотации AutoCreate.   -  person Arthur Ronald    schedule 28.04.2010
comment
@Arthur Ronald FD Garcia: Хорошо, я удалил аннотацию AutoCreate и заменил ее на @In (create = true). Я удалил все свои удаленные интерфейсы и запустил приложение 6 раз (потому что даже с удаленным интерфейсом приложение иногда работает нормально), все 6 раз оно работало нормально. Думаю, при удаленном интерфейсе не запутаешься, какой интерфейс использовать, локальный или удаленный.   -  person Harshad Vyawahare    schedule 29.04.2010


Ответы (2)


Я предполагаю следующий

 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 {}

Ваш апатрид должен выглядеть так

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

     public void doSomething() {

     }

 }

Внутри вашего компонента шва

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

 }
person Arthur Ronald    schedule 27.04.2010
comment
Артур, Спасибо за подробный ответ, но я делаю то же самое, что и вы, но все же сталкиваюсь с проблемой. - person Harshad Vyawahare; 28.04.2010
comment
@Harshad V Итак, мне нужно, чтобы вы показали, как выглядит ваше приложение: /WEB-INF/components.xml, ваш компонент EJB, см. stackoverflow.com/questions/ 2453746 / как должно выглядеть ваше приложение. Какой сервер приложений вы используете? - person Arthur Ronald; 28.04.2010
comment
Я использую сервер приложений JBoss 5.1.0.GA. Я проверил предоставленную вами ссылку, мое приложение выглядит так, как указано в ссылке, за исключением того, что в папке myapp-ejb.jar нет папки lib, а папка lib в папке myapp-war.war находится внутри папки WEB-INF , т.е. myapp-war.war \ WEB-INF \ lib. Я отредактировал свой вопрос выше и добавил свои компоненты components.xml и EJB. - person Harshad Vyawahare; 28.04.2010

@Arthur Ronald FD Garcia: Плохо, я проигнорировал небольшую часть ответа, который вы опубликовали выше.

В моем приложении у меня были интерфейсы MyStatelessLocal и MyStatelessRemote, но не было родительского интерфейса MyStateless. Я добавил абстрактные методы как в локальный, так и в удаленный интерфейсы, и они не были пустыми.

Когда я создал родительский интерфейс MyStateless, переместил абстрактные методы из локального и удаленного интерфейса в родительский (так, чтобы локальный и удаленный интерфейсы были пустыми), ошибка была устранена, и теперь мое приложение работает нормально!

Спасибо большое за помощь!

- Харшад Вьявахаре.

person Harshad Vyawahare    schedule 29.04.2010