我们将Spring MVC maven项目(X项目)依赖于另一个Spring-core项目(Y项目)
我们在第二个(Y)项目中定义了一个Spring组件(NotificationManager),我们在Spring mvc(X)项目的一个控制器@Authowire
中使用class(AccountController)
注入了这个组件。
虽然我们在tomcat 6.x应用服务器上没有遇到任何问题,但我们在Jboss 5.x Eap应用服务器上遇到了以下错误。
我们在目录" /web-inf/lib/Y.jar"中看到了包含NotificationManager
组件类的Y.jar文件。部署在Jboss上的X.war文件:*
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'accountController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.fa
ctory.BeanCreationException: Could not autowire field: private com.xxx.yy.jaws.manager.NotificationManager com.xxx.yy.jaws.controller.BaseController.notificationManager; nested exception i
s org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.xxx.yy.jaws.manager.NotificationManager] found for dependency: expected at least 1 bean which q
ualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
.....
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.xxx.yy.jaws.manager.NotificationManager com.xxx.yy.jaws.controller.BaseController.
notificationManager; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.xxx.yy.jaws.manager.NotificationManager] found for depen
dency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:508)
...
09:27:35,690 ERROR [[/jaws]] Servlet /jaws threw load() exception
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.xxx.yy.jaws.manager.NotificationManager] found for dependency: expected at least 1 bean which qua
lifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
....
Spring version: 4.0.0.RELEASE security.version: 3.2.5.RELEASE Java version: 1.6 org.jboss.jboss-vfs version :3.2.6.Final
那是春天的背景:
<context:component-scan base-package="com.xxx.yy" />
<mvc:annotation-driven>
<mvc:message-converters register-defaults="false">
<bean
class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="objectMapper">
<bean class="com.xxx.yy.jaws.spring.converter.JawsObjectMapper" />
</property>
</bean>
<bean id="imageConverter" class="org.springframework.http.converter.BufferedImageHttpMessageConverter"></bean>
</mvc:message-converters>
</mvc:annotation-driven>
<!-- Application Message Bundle -->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<!-- <property name="basename" value="classpath:messages" /> -->
<property name="basenames">
<list>
<value>classpath:messages</value>
<value>classpath:appErrHttpStatus</value>
</list>
</property>
<property name="defaultEncoding" value="UTF-8" />
</bean>
<!-- Declare the Interceptor -->
<mvc:interceptors>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" p:paramName="locale" />
<mvc:interceptor>
<mvc:mapping path="/**" />
<mvc:exclude-mapping path="${error.url.prefix}" />
<bean id="baseInterceptor" class="com.xxx.yy.jaws.interceptor.BaseInterceptor" />
</mvc:interceptor>
<bean id="executeTimeInterceptor" class="com.xxx.yy.jaws.interceptor.ExecuteTimeInterceptor" />
<mvc:interceptor>
<mvc:mapping path="${login.url.prefix}" />
<mvc:exclude-mapping path="${keyword.url.prefix}" />
<bean id="loginInterceptor" class="com.xxx.yy.jaws.interceptor.LoginInterceptor" />
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="${secure.url.prefix}" />
<bean id="signOnInterceptor" class="com.xxx.yy.jaws.interceptor.SignOnInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:jaws.jdbc.properties</value>
<value>classpath:jaws.app.properties</value>
<value>classpath:jaws.hibernate.properties</value>
</list>
</property>
</bean>
<bean id="nappsExceptionResolver" class="com.xxx.yy.jaws.spring.handlers.JawsExceptionResolver" />
<!-- ========================================================================================================= -->
<jee:jndi-lookup id="jawsDataSource" jndi-name="${jdbc.jawsDataSource}" cache="true" />
<bean id="jawsSessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="jawsDataSource" />
<property name="configLocation">
<value>classpath:jaws.hibernate.cfg.xml</value>
</property>
<property name="configurationClass">
<value>org.hibernate.cfg.AnnotationConfiguration</value>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
<prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
</props>
</property>
<property name="namingStrategy">
<ref bean="namingStrategy" />
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="jawsSessionFactory" />
</bean>
<tx:annotation-driven />
<bean id="namingStrategy" class="com.xxx.yy.jaws.strategy.hibernate.CustomNamingStrategy" />