我从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>
非常感谢任何帮助。
答案 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所做的超集。