2014-06-06 106 views
3

我想在Spring的Web應用程序中使用Hibernate的註釋和數據源,但是出現「NoSuchBeanDefinitionException」錯誤,我不知道爲什麼。從我的角度來看都是正確的......如果有人能幫助我解決它,它是非常好的,我:)在Spring項目中使用DataSource和sessionFactory進行Hibernate註釋

這是我的根的context.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xsi:schemaLocation="http://www.springframework.org/schema/beans 
         http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
         http://www.springframework.org/schema/mvc 
         http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd 
         http://www.springframework.org/schema/tx 
         http://www.springframework.org/schema/tx/spring-tx-3.2.xsd 
         http://www.springframework.org/schema/context 
         http://www.springframework.org/schema/context/spring-context-3.2.xsd 
         http://www.springframework.org/schema/jee 
         http://www.springframework.org/schema/jee/spring-jee-3.2.xsd" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:jee="http://www.springframework.org/schema/jee" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xmlns="http://www.springframework.org/schema/beans"> 

<context:component-scan base-package="fot.manager.service, fot.manager.dao" /> 

<context:annotation-config /> 

<!-- To use transactions --> 
<tx:annotation-driven transaction-manager="transactionManager" /> 

<!-- DataSource --> 
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" value="jdbc:mysql://localhost/f1_tycoon" /> 
    <property name="username" value="root" /> 
    <property name="password" value="" /> 
</bean> 

<!-- Hibernate --> 
<bean id="sessionFactory" name="connectionDB" 
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="myDataSource" /> 
    <property name="annotatedClasses"> 
     <list> 
      <value>fot.manager.model.Bannissement</value> 
      <value>fot.manager.model.CategorieForum</value> 
      <value>fot.manager.model.CategorieNews</value> 
      <value>fot.manager.model.Commentaire</value> 
      <value>fot.manager.model.MessageForum</value> 
      <value>fot.manager.model.News</value> 
      <value>fot.manager.model.Pilote</value> 
      <value>fot.manager.model.Rang</value> 
      <value>fot.manager.model.SectionForum</value> 
      <value>fot.manager.model.Signalement</value> 
      <value>fot.manager.model.SujetForum</value> 
      <value>fot.manager.model.Utilisateur</value> 
     </list> 
    </property> 
    <property name="hibernateProperties"> 
     <value> 
      hibernate.dialect=org.hibernate.dialect.MySQLDialect 
      hibernate.show_sql=true 
      hibernate.format_sql=true 
     </value> 
    </property> 
</bean> 

<bean id="transactionManager" 
    class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 

網站.XML:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns="http://java.sun.com/xml/ns/javaee" 
      xmlns:web="http://java.sun.com/xml/ns/javaee" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> 
    <display-name>fot.manager</display-name> 
    <welcome-file-list> 
    <welcome-file>connexion.html</welcome-file> 
    </welcome-file-list> 

    <context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/classes/root-context.xml</param-value> 
    </context-param> 

    <servlet> 
    <servlet-name>dispatcher</servlet-name> 
    <servlet-class> 
      org.springframework.web.servlet.DispatcherServlet 
     </servlet-class> 
    <load-on-startup>1</load-on-startup> 
    </servlet> 

    <!-- Ajax servlet --> 
    <servlet> 
     <servlet-name>ajax</servlet-name> 
      <servlet-class> 
       org.springframework.web.servlet.DispatcherServlet 
      </servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
    <servlet-name>dispatcher</servlet-name> 
    <url-pattern>*.html</url-pattern> 
    </servlet-mapping> 

    <servlet-mapping> 
     <servlet-name>ajax</servlet-name> 
     <url-pattern>/ajax/*</url-pattern> 
    </servlet-mapping> 
</web-app> 

而且堆棧跟蹤:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [fot.manager.service.NewsService] 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:986) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:856) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:768) 
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:486) 
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) 
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:285) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1122) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:522) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:461) 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295) 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:626) 
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932) 
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479) 
at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:651) 
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:599) 
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:665) 
at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:518) 
at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:459) 
at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136) 
at javax.servlet.GenericServlet.init(GenericServlet.java:158) 
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1284) 
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1197) 
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1087) 
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5210) 
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5493) 
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3988) 
at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:425) 
at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1345) 
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1530) 
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1540) 
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1540) 
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1519) 
at java.lang.Thread.run(Unknown Source) 

我也已經爲Java文件的其他錯誤堆棧跟蹤:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jqGridController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private fot.manager.service.NewsService fot.manager.ajax.jqGridController.newsService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [fot.manager.service.NewsService] 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:288) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1122) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:522) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:461) 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295) 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:626) 
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932) 
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479) 
at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:651) 
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:599) 
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:665) 
at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:518) 
at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:459) 
at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136) 
at javax.servlet.GenericServlet.init(GenericServlet.java:158) 
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1284) 
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1197) 
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1087) 
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5210) 
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5493) 
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3988) 
at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:425) 
at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1345) 
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1530) 
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1540) 
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1540) 
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1519) 
at java.lang.Thread.run(Unknown Source) 
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private fot.manager.service.NewsService fot.manager.ajax.jqGridController.newsService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [fot.manager.service.NewsService] 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:514) 
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:285) 
    ... 31 more 
    Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [fot.manager.service.NewsService] 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:986) 
     at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:856) 
     at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:768) 
     at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:486) 
     ... 33 more 

和Java文件:

package fot.manager.ajax; 

import java.util.Collection; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.ResponseBody; 

import fot.manager.model.News; 
import fot.manager.service.NewsService; 

@Controller 

@RequestMapping("/ajax") 

public class jqGridController { 

    @Autowired 
    private NewsService newsService; 

    // Contrôleur pour afficher les news 
    @RequestMapping("/getNews") 
    @ResponseBody 
    public Collection<News> getNews(){ 
     Collection<News> listNews = newsService.getAllNews(); 

     for (News news : listNews){ 
      System.out.println(news.getAuteur().getPseudo()); 
     } 

     return listNews; 
    } 
} 

我NewsService類實現:

package fot.manager.service.impl; 

import java.util.Collection; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Service; 
import org.springframework.transaction.annotation.Transactional; 

import fot.manager.dao.NewsDao; 
import fot.manager.model.News; 
import fot.manager.service.NewsService; 

@Service("newsService") 
@Transactional 
public class NewsServiceImpl implements NewsService { 

    @Autowired 
    private NewsDao newsDao; 

    @Override 
    public Collection<News> getAllNews() { 
     return newsDao.getAllNews(); 
    } 

    @Override 
    public News getNewsById(int id) { 
     return newsDao.getNewsById(id); 
    } 

    @Override 
    public News editNews(News news) { 
     return newsDao.editNews(news); 
    } 

    @Override 
    public News deleteNews(int id) { 
     return newsDao.deleteNews(id); 
    } 
} 

和接口:

package fot.manager.service; 

import java.util.Collection; 

import fot.manager.model.News; 

    public interface NewsService { 
     Collection<News> getAllNews(); 
     News getNewsById(int id); 
     News editNews(News news); 
     News deleteNews(int id); 
    } 

調度-的servlet:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd"> 

    <context:component-scan base-package="bgc.isis.generator.controller"/> 

    <context:annotation-config/> 

    <!-- Resources --> 
    <mvc:resources location="/resources/images/, /resources/css/, /resources/js/" mapping="/resources/**"/> 

    <!-- Configures the @Controller programming model --> 
    <mvc:annotation-driven /> 

    <!-- 
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> 
     <property name="prefix" value="/WEB-INF/pages/" /> 
     <property name="suffix" value=".jsp" /> 
    </bean>--> 


    <bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 
     <property name="viewClass"> 
      <value> 
       org.springframework.web.servlet.view.tiles2.TilesView 
      </value> 
     </property> 
    </bean> 
    <bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer"> 
     <property name="definitions"> 
      <list> 
       <value>/WEB-INF/tiles.xml</value> 
      </list> 
     </property> 
    </bean>  
</beans> 

<!-- ViewResolver class : org.springframework.web.servlet.view.UrlBasedViewResolver --> 

非常感謝解決我的問題:)

+0

哪裏是你的MVC aonnation配置?如何找到/實例化控制器。 – NimChimpsky

+0

幽默我一秒鐘,請嘗試更改組件掃描到'fot.manager.service.impl'而不是'fot.manager.service'。我知道當你指定一個單獨的父對象時(字符串中沒有逗號),Spring將掃描所有的子對象包,但是如果在你有多個包的情況下同樣適用,我無法從文檔中找出 – geoand

+0

忘記了我的調度程序servlet,對不起...我已經添加了他 – Odawin

回答

0

我不知道這個語法是有效的(至少在doc我不能找到它):

<context:component-scan base-package="fot.manager.service, fot.manager.dao" /> 

我認爲你正在尋找:

<context:component-scan base-package="fot.manager"> 
    <context:include-filter type="regex" expression=".*\.service\..*"/> 
    <context:include-filter type="regex" expression=".*\.dao\..*"/> 
</contextn:component-scan> 
+0

已經是相同的:/ – Odawin

0

因爲你已經合格NewsServiceImpl小號使用newsService邏輯名稱的服務註釋,則需要將其與相應的Qualifier註釋匹配,否則Spring將嘗試注入不存在的不合格的NewsService

@Autowired 
@Qualifier("newsService") 
private NewsService newsService; 

或者你可以簡單地刪除邏輯名稱NewsServiceImpl's@Service註釋

+0

已經是相同的:/ – Odawin

相關問題