使用Spring部署EJB 3.0 MDB告诉我已经定义了我的组件

时间:2013-10-08 17:31:17

标签: spring hibernate maven jboss7.x ejb-3.0

我从eclipse的部署中得到以下异常,告诉我我有一个重复的组件。它只被定义为我能看到的一个类。我已经尝试重命名它,以防它干扰JBoss中的现有组件(看到有这个问题的人)具有相同的结果。这是我第一次使用@Interceptors(SpringBeanAutowiringInterceptor.class)。我配错了吗?我已经使用Eclipse / Kepler创建EJB 3.0项目,然后使用配置/转换为Maven项目。我想知道这是否导致生成两个相同的类,但使用linux find命令告诉我只有一个MdbDequeueFrom.class。如果我注释掉,项目将在调试器中部署和执行:

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

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

出现同样的问题,WEB-INF / lib /下的jar库中包含一个重复的bean.

答案 1 :(得分:0)

如果使用SpringBeanAutowiringInterceptor,则必须非常小心,不要让Spring上下文扫描程序扫描该bean,因为这会导致麻烦。手册warns about this as well

  

警告:不要定义与Spring管理的bean相同的bean   EJB3会话bean在同一部署单元中。尤其是   组合使用此功能时要小心   部署基于Spring的EJB3会话bean:确保这一点   EJB3会话bean不会被自动检测为Spring管理的bean   好吧,使用适当的包裹限制。

我认为你应该删除它:

<context:annotation-config />

并确认这不包括您的MDB:

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

因此,您应该仅在以外的包上使用组件扫描。您拥有bean的包。如果在所有相关包上使用组件扫描,则不需要Annotation-config。组件扫描执行annotation-config所做的超集。