2010-04-27 4 views
2

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

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

SeamInterceptor настроен,
Я уточнил JNDI шаблона в components.xml файл (< ядра: INIT отлаживать = «истинный» JNDI-шаблон =» 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="@[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> 

И мой EJB компонент выглядит следующим образом:

 

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

    public void doSomething() { 

    } 

} 

 
+0

Я проверил журналы jboss, я наблюдал эту строку в файле журнала: DEBUG [org.jboss.seam.Component] (main) org.jboss.seam.core.init.jndiPattern = myEarName/# {ejbName}/local, JndiPattern устанавливается правильно. –

+0

V Кажется правильным! Попробуйте следующее: ** удалите удаленный интерфейс ** и посмотрите, работает ли ваше приложение в порядке. Если нет, покажите свой стек. Если возможно, обойтись без аннотации AutoCreate. –

+0

@Arthur Ronald F D Garcia: Хорошо, я удалил аннотацию AutoCreate и заменил ее на @In (create = true). Я удалил все мои удаленные интерфейсы и запустил приложение 6 раз (потому что даже с удаленным интерфейсом приложение прекрасно работает), он работает отлично все 6 раз. Я думаю, что с удаленным интерфейсом удаленный шов не путается, какой интерфейс использовать, локальный или удаленный. –

ответ

7

Я полагаю, что следующий один

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() { 

    } 

} 

Внутри вашего 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

Артур, Спасибо за подробный ответ, но я точно делаю то же самое, о чем вы упоминали, но я столкнулся с проблемой. –

+0

@Harshad V Итак, вам нужно показать, как выглядит ваше приложение: */WEB-INF/components.xml *, ваш компонент EJB, см. Http://stackoverflow.com/questions/2453746/jboss-seam-enabling-debug -page-on-weblogic-10-3-2-11g/2459795 # 2459795 как должно выглядеть ваше приложение. Какой сервер приложений вы используете? –

+0

Я использую сервер приложений JBoss 5.1.0.GA. Я проверил ссылку, которую вы предоставили, мое приложение выглядит так, как указано в ссылке, за исключением того, что в папке myapp-ejb.jar нет папки lib, а папка lib в папке myapp-war.war находится внутри папки WEB-INF , т.е. myapp-war.war \ WEB-INF \ lib. Я отредактировал мой вопрос выше и добавил компонент components.xml и EJB. –

0

@Arthur Ronald F D Гарсия: Мой плохой, я игнорировал небольшую часть ответа вы публикуемые выше.

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

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

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

--Harshad Vyawahare.

 Смежные вопросы

  • Нет связанных вопросов^_^