没有合格的bean ... spring-webmvc:在applicationContext中定义的bean在ServletContext中不可见

时间:2015-02-24 17:02:44

标签: spring-mvc applicationcontext servletcontextlistener

我在APplicationContext中定义的bean有问题。 (可能是我的问题是了解Application~Servlet上下文?)

所以,我定义< bean id =" messageSource" in:

applicationContext.xml

    <beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc 

http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
        http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.
<!-- // configure manage of transactions using annotations @Transactional // -->

<tx:annotation-driven />

<!-- // SPRING-SECURITY // -->
<import resource="security-servlet.xml" />

<!-- // DB1 - Database Configuration // -->
<context:property-placeholder location="/WEB-INF/spring/db.config/jdbc-db1.properties" />

<import resource="./db.config/DataSource-db1.xml" />
<import resource="./db.config/jpa-config-db1.xml" />

<!-- Auto scan the components -->
<context:annotation-config />

<!-- // common beans for rest & mvc // -->
<context:component-scan base-package="abc.def.data"  />

<bean
    id="messageSource"
    class="org.springframework.context.support.ResourceBundleMessageSource"
>
    <property
        name="basename"
        value="validation" />
</bean>

我也在web.xml中定义了mvc-servlet.xml:

    <!-- // MVC // -->
<servlet>
    <servlet-name>mvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>WEB-INF/spring/mvc-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>mvc</servlet-name>
    <url-pattern>*.htm</url-pattern>
</servlet-mapping>

在我的@controller中,我使用bean messageSource这样:

@Controller
@RequestMapping( value = "/admin/su" )
public class AdminSuController {
private final Logger LOG = LoggerFactory.getLogger( getClass() );
    .....
    @Autowired
    private ResourceBundleMessageSource messageSource;

当我在mvc-servlet.xml中定义bean时 - 没有问题 一旦我移动它(因为我理解servletContext的根上下文)ApplicationContext.xml(我这样做是为了在REST-servlet.xml和其他@ controller-s中使用这个bean)我得到:

#19:41:26.594 [localhost-startStop-1] ERROR 
  

o.s.web.servlet.DispatcherServlet - 上下文初始化失败   org.springframework.beans.factory.BeanCreationException:错误   创建名称为&#39; addressController&#39;:注入自动装配的bean   依赖失败;嵌套异常是   org.springframework.beans.factory .BeanCreationException:不能   autowire字段:私有   org.springframework.context.support.ResourceBundleMessageSource   abc.def.rest.controller.AddressController.messageSource;嵌套   例外是org.sp   ringframework.beans.factory.NoSuchBeanDefinitionException:没有   合格的bean类型   [org.springframework.context.support.ResourceBundleMessageSource]   找到依赖:预计至少有1个bean符合条件   autowire候选人这种依赖。依赖注释:   {@ org.springframework.beans.factory.annotation.Autowired(所需=真)}     在   org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)   〜[spring-beans-4.1.4.RELEASE.jar:4.1.4.RELEASE] at   org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1202)   〜[spring-beans-4.1.4.RELEASE.jar:4.1.4.RELEASE] at   org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)   〜[spring-beans-4.1.4.RELEASE.jar:4.1.4.RELEASE] at   org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)   〜[spring-beans-4.1.4.RELEASE.jar:4.1.4.RELEASE] at   org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:303)   〜[spring-beans-4.1.4.RELEASE.jar:4.1.4.RELEASE] at   org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)   〜[spring-beans-4.1.4.RELEASE.jar:4.1.4.RELEASE] at   org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299)   〜[spring-beans-4.1.4.RELEASE.jar:4.1.4.RELEASE] at   org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)   〜[spring-beans-4.1.4.RELEASE.jar:4.1.4.RELEASE] at   org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:762)   〜[spring-beans-4.1.4.RELEASE.jar:4.1.4.RELEASE] at   org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)   〜[spring-context-4.1.4.RELEASE.jar:4.1.4.RELEASE] at   org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)   〜[spring-context-4.1.4.RELEASE.jar:4.1.4.RELEASE] at   org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:663)   〜[spring-webmvc-4.1.4.RELEASE.jar:4.1.4.RELEASE] at   org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:629)   〜[spring-webmvc-4.1.4.RELEASE.jar:4.1.4.RELEASE] at   org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:677)   〜[spring-webmvc-4.1.4.RELEASE.jar:4.1.4.RELEASE] at   org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:548)   〜[spring-webmvc-4.1.4.RELEASE.jar:4.1.4.RELEASE] at   org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:489)   〜[spring-webmvc-4.1.4.RELEASE.jar:4.1.4.RELEASE] at   org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)   [spring-webmvc-4.1.4.RELEASE.jar:4.1.4.RELEASE] at   javax.servlet.GenericServlet.init(GenericServlet.java:158)   [servlet-api.jar:3.0.FR] at   org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1284)   [catalina.jar:7.0.59] at   org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1197)   [catalina.jar:7.0.59] at   org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1087)   [catalina.jar:7.0.59] at   org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5262)   [catalina.jar:7.0.59] at   org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5550)   [catalina.jar:7.0.59] at   org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)   [catalina.jar:7.0.59] at   org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)   [catalina.jar:7.0.59] at   org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)   [catalina.jar:7.0.59] at   org.apache.catalina.core.StandardHost.addChild(StandardHost.java:649)   [catalina.jar:7.0.59] at   org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1245)   [catalina.jar:7.0.59] at   org.apache.catalina.startup.HostConfig $ DeployDirectory.run(HostConfig.java:1895)   [catalina.jar:7.0.59] at   java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:471)   [na:1.7.0] at   java.util.concurrent.FutureTask中$ Sync.innerRun(FutureTask.java:334)   [na:1.7.0] at   java.util.concurrent.FutureTask.run(FutureTask.java:166)[na:1.7.0]     在   java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)   [na:1.7.0] at   java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:603)   [na:1.7.0]在java.lang.Thread.run(Thread.java:722)[na:1.7.0]引起   by:org.springframework.beans.factory.BeanCreationException:不能   autowire字段:私有   org.springframework.context.support.ResourceBundleMessageSource   abc.def.rest.controller.AddressControll er.messageSource;嵌套   例外是   org.springframework.beans.factory.NoSuchBeanDefinitionException:没有   合格的bean类型   [org.springframework.context.support.ResourceBundleMessageSource]   找到依赖:预计至少有1个bean符合条件   autowire候选人这种依赖。依赖注释:   {@ org.springframework.beans.factory.annotation.Autowired(所需=真)}     在   org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:561)   〜[spring-beans-4.1.4.RELEASE.jar:4.1.4.RELE ASE] at   org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)   〜[spring-beans-4.1.4.RELEASE.jar:4.1.4.RELEASE] at   org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331)   〜[spring-beans-4.1.4.RELEASE.jar:4.1.4.RELEASE] ... 34个常见帧   省略引起:   org.springframework.beans.factory.NoSuchBeanDefinitionException:没有   合格的bean类型   [org.springframework.context.support.ResourceBundleMessageSource]   发现依赖:预期在1豆的条件下符合条件   autowire候选人这种依赖。依赖注释:   {@ org.springframework.beans.factory.annotation.Autowired(所需=真)}     在   org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1308)   〜[spring-beans-4.1.4.RELEASE.jar:4.1.4.RELEASE] at   org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1054)   〜[spring-beans-4.1.4.RELEASE.jar:4.1.4.RELEASE] at   org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:949)   〜[spring-beans-4.1.4.RELEASE.jar:4.1.4.RELEASE] at   org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:533)   〜[spring-beans-4.1.4.RELEASE.jar:4.1.4.RELE ASE] ... 36个常见帧   省略

1 个答案:

答案 0 :(得分:1)

谢谢https://stackoverflow.com/users/2843242/oerlien 这里是回答Moving messageSource to applicationContext causes the default messageSource not to be visible in dispatcher-servlet context

In your applicationContext.xml:

<bean id="baseMessageSource" class="org.springframework...YourMessageSourceClass">
   ...
</bean>

In your xxx-servlet.xml:

<bean id="messageSource" parent="baseMessageSource" />