2014-12-28 80 views
0

我正在尝试使用@Bean注释来配置一个在Spring MVC Controller应用程序中使用的Bean。Spring MVC @EnableWebMvc Bean配置

就我所知,@Bean注释等同于XML配置中的标记。什么我做的是以下几点:

类与配置

@Configuration 
public class ContextConfig { 
    @Bean 
    public MyBean myBean() { 
     return new MyBean(); 
    } 
} 

但是,试图自动装配为myBean在MVC控制器失败的时候。

这个bean注入

@Controller 
public class HomeController { 

    @Autowired 
    private MyBean myBean; 

    @RequestMapping({"/", "/home"}) 
    public ModelAndView home (ModelAndView model) { 
     model.setViewName("home"); 
     return model; 
    } 
} 

的错误是:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'homeController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private javax.validation.ValidatorFactory com.proeza.sgs.controller.HomeController.factory; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [javax.validation.ValidatorFactory] found for dependency: 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.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) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:700) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) 
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403) 
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306) 
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106) 
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4939) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5434) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:262) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:744) 
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private javax.validation.ValidatorFactory com.proeza.sgs.controller.HomeController.factory; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [javax.validation.ValidatorFactory] found for dependency: 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) 
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289) 
    ... 22 more 
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [javax.validation.ValidatorFactory] found for dependency: 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.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1100) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:960) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:855) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480) 
    ... 24 more 

最后评论

  1. 存在配置的其他豆类通过注释(@Bean),这是注入没有问题。
  2. MyBean类没有实现也没有扩展任何东西。

    <context-param> 
        <param-name>contextConfigLocation</param-name> 
        <param-value>com.myapp.config</param-value> 
    </context-param> 
    

    ContextConfig类是在包

    任何想法,为什么会出现这种情况:

  3. 的配置位置在web.xml中

的conf声明?

+0

你可以请你展示你的MyBean实现吗?它是否实现了一个接口并使用@Transactional注解? – Nitek

回答

0

感谢Ilya的回应。 你是对的,我粘贴的堆栈不正确。原因在于,为了简化,我用MyBean举了一个例子,我忘了在堆栈中重命名它。

问题已解决。 MyBean的真名是MessageResolver,发生的事情是我已经在ContextConfig类中有另一个名为messageResolver的方法,用于为Thymeleaf创建一个bean。不同的是,我的不接收参数和另一组接受MessageSource的,但是...读春天docmentation我发现这一点:

春文件引用:

2.2.6。自定义bean命名

默认情况下,JavaConfig使用@Bean方法的名称作为 生成bean的名称。但是,可以使用BeanNamingStrategy扩展点使用 来覆盖此功能。

Spring @Bean doc

所以,问题是没有被创建的豆,因为它被overrided它的定义。 错误消失只是重命名messageResolver方法。

再次感谢。问候!

1

该异常与MyBean类无关。例外情况如下:

No qualifying bean of type [javax.validation.ValidatorFactory] found for dependency 

Spring未能将javax.validation.ValidatorFactory注入到HomeController类。检查ValidatorFactory类的配置。