0

eclipse からのデプロイで次の例外が発生し、コンポーネントが重複していることがわかります。私が見ることができるのは1つのクラスとしてのみ定義されています。JBossの既存のコンポーネントに干渉する場合に備えて、名前を変更してみました(この問題を抱えている人を見ました)同じ結果になりました。@Interceptors(SpringBeanAutowiringInterceptor.class) を使用したのは初めてです。設定が間違っていますか?Eclipse/Kepler を使用して EJB 3.0 プロジェクトを作成し、Maven プロジェクトに構成/変換しました。これにより 2 つの同一のクラスが生成されたのではないかと思いましたが、Linux の find コマンドを使用すると、MdbDequeueFrom.class が 1 つしかないことがわかりました。コメントアウトすると、プロジェクトはデバッガーでデプロイおよび実行されます。

//    @Stateless
//    @Interceptors(SpringBeanAutowiringInterceptor.class)

豆が注入されないことを除いて。

コメントアウトされていない場合の例外:

Caused by: java.lang.IllegalArgumentException: JBAS011046: A component named 
           'MdbDequeueFrom' is already defined in this module
    at 
   org.jboss.as.ee.component.EEModuleDescription.addComponent(EEModuleDescription.java:140)

私のMDBは次のように定義されています:

   @MessageDriven(
    activationConfig = { @ActivationConfigProperty(
            propertyName = "destinationType", propertyValue =   
                       "javax.jms.Queue"), 
            @ActivationConfigProperty(propertyName = "destination",  
     propertyValue = "java:jboss/activemq/queue/IN_FROM"),
            @ActivationConfigProperty(propertyName="acknowledgeMode", 
      propertyValue="Auto-acknowledge")
    })
   @Stateless
   @Interceptors(SpringBeanAutowiringInterceptor.class)
   @ResourceAdapter("activemq-ra.rar")
   public class MdbDequeueFrom implements MessageListener {

   @Autowired
   private ReferralService referralService;

   public MdbDequeueFrom() {

   }

サービスは次のように定義されます。

   @Service("referralService")
   @Transactional(readOnly = false)
   public class ReferralServiceImpl implements ReferralService {

   private static final Logger logger = 
     LoggerFactory.getLogger(ReferralServiceImpl.class);

   @Autowired
   private ReferralDao referralDao;

私の beanRefContext.xml は次のとおりです。

  <?xml version="1.0" encoding="UTF-8"?>
      <beans>
       <bean class="org.springframework.context.support.ClassPathXmlApplicationContext">
       <constructor-arg value="classpath*:applicationContext.xml" />
     </bean>
   </beans>

私のapplication.contextには次のものがあります:

      <context:component-scan base-package="com.MdbDequeue"/>

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
     <property name="jndiName" value="java:/OracleDS"/>
     </bean>

   <bean id="sessionFactory" 
     class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="mappingLocations">
        <list>
            <value>classpath*:hbm/Referral.hbm.xml</value>
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.format_sql">true</prop>
            <prop key="javax.persistence.validation.mode">none</prop>
        </props>

    </property>
   </bean>

<tx:annotation-driven transaction-manager="transactionManager"/>

<bean id="transactionManager" 
     class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

<bean id="messageSource" 
     class="org.springframework.context.support.ResourceBundleMessageSource"
      p:basenames="messages" />

<context:annotation-config />

</beans>

これは、EJB 3.0 Maven プロジェクトとして定義されています。

    <project xmlns="http://maven.apache.org/POM/4.0.0" 
       xmlns:xsi="http://www.w3.org  /2001/XMLSchema-instance" 
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0    
    http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <groupId>MyGroup</groupId>
   <artifactId>MdbDequeuer</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>ejb</packaging>
   <name>MdbDequeuer</name>

どんな助けでも大歓迎です。

4

2 に答える 2

1

同じ問題が発生し、WEB-INF/lib/ の下の jar ライブラリの 1 つに重複した Bean が含まれています。

于 2016-03-24T05:49:32.353 に答える
0

SpringBeanAutowiringInterceptor を使用する場合は、Spring コンテキスト スキャナーでその Bean をスキャンしないように細心の注意を払う必要があります。問題が発生する可能性があります。マニュアルはこれについても警告しています

警告: Spring 管理 Bean および EJB3 セッション Bean と同じ Bean を同じデプロイメント ユニットで定義しないでください。特に、この機能を Spring ベースの EJB3 セッション Bean のデプロイメントと組み合わせて使用​​する場合は注意してください。適切なパッケージ制限を使用して、EJB3 セッション Bean が Spring 管理の Bean としても自動検出されないようにしてください。

これを削除する必要があると思います:

<context:annotation-config />

これが MDB をカバーしていないことを確認します。

<context:component-scan base-package="com.MdbDequeue"/>

そのため、Bean が含まれているパッケージ以外のパッケージでのみ component-scanを使用する必要があります。関連するすべてのパッケージで component-scan を使用する場合、Annotation-config は必要ありません。component-scan は、annotation-config が行うことのスーパーセットを行います。

于 2013-10-08T17:46:30.127 に答える