2016-11-16 36 views
0

我終於找到了我的問題的原因。這不像錯誤筆記所顯示的那樣清楚。這是由我的MyTutorialWebAppInitializer引起的。無法使用SpringMVC和休眠自動裝配字段

以前它是如下:

public class MyTutorialWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { 
    protected Class<?>[] getRootConfigClasses() { 
     return new Class<?>[] { RootConfig.class }; 
    } 

    protected Class<?>[] getServletConfigClasses() { 
     return new Class<?>[] { WebConfig.class }; 
    } 

    protected String[] getServletMappings() { 
     return new String[]{"/home/","/about/"}; 
    } 
} 

我改變之後,現在一切工作正常!!!!

public class MyTutorialWebAppInitializer implements WebApplicationInitializer { 

    @Override 
    public void onStartup(ServletContext servletContext) throws ServletException { 
     AnnotationConfigWebApplicationContext appContext = new AnnotationConfigWebApplicationContext(); 
     appContext.register(WebConfig.class); 

     ServletRegistration.Dynamic dispatcher = servletContext.addServlet(
       "SpringDispatcher", new DispatcherServlet(appContext)); 
     dispatcher.setLoadOnStartup(1); 
     dispatcher.addMapping("/about/","/home/"); 

    } 
} 

嗨,我是爲JEE web開發一個新手。我正在使用Spring MVC和Hibernate來連接MySql數據庫。 Fowlloing對於我的第一個數據庫訪問來說是一個非常直接的例子,但是我在編譯錯誤方面經歷了很長時間。任何建議將不勝感激。

的錯誤信息:

>  Caused by: org.springframework.beans.factory.BeanCreationException: Error 
> creating bean with name 'puzzleServiceImpl': Injection of autowired 
> dependencies failed; nested exception is 
> org.springframework.beans.factory.BeanCreationException: Could not 
> autowire field: private com.mytutorial.dao.PuzzleDAO 
> com.mytutorial.service.impl.PuzzleServiceImpl.puzzleDAO; nested 
> exception is org.springframework.beans.factory.BeanCreationException: 
> Error creating bean with name 'puzzleDAOImpl': Injection of autowired 
> dependencies failed; nested exception is 
> org.springframework.beans.factory.BeanCreationException: Could not 
> autowire field: private org.hibernate.SessionFactory 
> com.mytutorial.dao.impl.PuzzleDAOImpl.sessionFactory; nested exception 
> is org.springframework.beans.factory.NoSuchBeanDefinitionException: No 
> qualifying bean of type [org.hibernate.SessionFactory] 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.findAutowireCandidates(DefaultListableBeanFactory.java:910) 
> at 
> org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:853) 
> at 
> org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:768) 
> at 
> org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:486) 
> ... 60 more Caused by: 
> org.springframework.beans.factory.BeanCreationException: Could not 
> autowire field: private com.mytutorial.dao.PuzzleDAO 
> com.mytutorial.service.impl.PuzzleServiceImpl.puzzleDAO; nested 
> exception is org.springframework.beans.factory.BeanCreationException: 
> Error creating bean with name 'puzzleDAOImpl': Injection of autowired 
> dependencies failed; nested exception is 
> org.springframework.beans.factory.BeanCreationException: Could not 
> autowire field: private org.hibernate.SessionFactory 
> com.mytutorial.dao.impl.PuzzleDAOImpl.sessionFactory; nested exception 
> is org.springframework.beans.factory.NoSuchBeanDefinitionException: No 
> qualifying bean of type [org.hibernate.SessionFactory] 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) 
> ... 71 more Caused by: 
> org.springframework.beans.factory.BeanCreationException: Error 
> creating bean with name 'puzzleDAOImpl': Injection of autowired 
> dependencies failed; nested exception is 
> org.springframework.beans.factory.BeanCreationException: Could not 
> autowire field: private org.hibernate.SessionFactory 
> com.mytutorial.dao.impl.PuzzleDAOImpl.sessionFactory; nested exception 
> is org.springframework.beans.factory.NoSuchBeanDefinitionException: No 
> qualifying bean of type [org.hibernate.SessionFactory] 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.findAutowireCandidates(DefaultListableBeanFactory.java:910) 
> at 
> org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:853) 
> at 
> org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:768) 
> at 
> org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:486) 
> ... 73 more Caused by: 
> org.springframework.beans.factory.BeanCreationException: Could not 
> autowire field: private org.hibernate.SessionFactory 
> com.mytutorial.dao.impl.PuzzleDAOImpl.sessionFactory; nested exception 
> is org.springframework.beans.factory.NoSuchBeanDefinitionException: No 
> qualifying bean of type [org.hibernate.SessionFactory] 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) 
> ... 84 more Caused by: 
> org.springframework.beans.factory.NoSuchBeanDefinitionException: No 
> qualifying bean of type [org.hibernate.SessionFactory] 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) 
> ... 86 more 

的DataPuzzle.java:

package com.mytutorial.data; 

import javax.persistence.*; 

/** 
* Created by bjhl on 11/16/16. 
*/ 

@Entity 
@Table(name = "puzzles") 
public class DataPuzzle { 

    @Id 
    @GeneratedValue 
    @Column(name = "id") 
    private Integer id; 

    @Column(name = "title") 
    private String title; 

    @Column(name = "author") 
    private String author; 

    @Column(name = "price") 
    private float price; 

    public Integer getId() { 
     return id; 
    } 

    public String getTitle() { 
     return title; 
    } 

    public String getAuthor() { 
     return author; 
    } 

    public float getPrice() { 
     return price; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    public void setTitle(String title) { 
     this.title = title; 
    } 

    public void setAuthor(String author) { 
     this.author = author; 
    } 

    public void setPrice(float price) { 
     this.price = price; 
    } 
} 

的PuzzleDAO:

public interface PuzzleDAO { 

    public void addPuzzle(DataPuzzle dataPuzzle); 
    public List<DataPuzzle> getPuzzles(); 
    public void removePuzzle(Integer id); 

} 

的PuzzleDAOImpl

package com.mytutorial.dao.impl; 

import com.mytutorial.dao.PuzzleDAO; 
import com.mytutorial.data.DataPuzzle; 
import org.hibernate.SessionFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Repository; 

import java.util.List; 

; 

/** 
* Created by bjhl on 11/16/16. 
*/ 


@Repository 
public class PuzzleDAOImpl implements PuzzleDAO { 

    @Autowired 
    private SessionFactory sessionFactory; 

    public void addPuzzle(DataPuzzle dataPuzzle) { 
     sessionFactory.getCurrentSession().save(dataPuzzle); 
    } 

    public List<DataPuzzle> getPuzzles() { 
     return sessionFactory.getCurrentSession().createQuery("from DataPuzzle") 
       .list(); 
    } 

    public void removePuzzle(Integer id) { 
     DataPuzzle puzzle = (DataPuzzle) sessionFactory.getCurrentSession().load(
       DataPuzzle.class, id); 
     if (null != puzzle) { 
      sessionFactory.getCurrentSession().delete(puzzle); 
     } 
    } 
} 

的PuzzleService:

package com.mytutorial.service; 

import com.mytutorial.data.DataPuzzle; 

import java.util.List; 

/** 
* Created by bjhl on 11/16/16. 
*/ 
public interface PuzzleService { 

    public void addPuzzle(DataPuzzle dataPuzzle); 
    public List<DataPuzzle> getPuzzles(); 
    public void removePuzzle(Integer id); 
} 

的PuzzleServiceImpl

package com.mytutorial.service.impl; 

import com.mytutorial.dao.PuzzleDAO; 
import com.mytutorial.data.DataPuzzle; 
import com.mytutorial.service.PuzzleService; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Service; 
import org.springframework.transaction.annotation.Transactional; 

import java.util.List; 

/** 
* Created by bjhl on 11/16/16. 
*/ 

@Service 
public class PuzzleServiceImpl implements PuzzleService { 

    @Autowired 
    private PuzzleDAO puzzleDAO; 

    @Transactional 
    public void addPuzzle(DataPuzzle dataPuzzle) { 
     puzzleDAO.addPuzzle(dataPuzzle); 
    } 

    @Transactional 
    public List<DataPuzzle> getPuzzles() { 
     return puzzleDAO.getPuzzles(); 
    } 

    @Transactional 
    public void removePuzzle(Integer id) { 
     puzzleDAO.removePuzzle(id); 
    } 
} 

的WebConfig

package com.mytutorial.config; 

import org.apache.commons.dbcp.BasicDataSource; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.PropertySource; 
import org.springframework.core.env.Environment; 
import org.springframework.orm.hibernate4.HibernateTransactionManager; 
import org.springframework.orm.hibernate4.LocalSessionFactoryBean; 
import org.springframework.transaction.annotation.EnableTransactionManagement; 
import org.springframework.web.servlet.ViewResolver; 
import org.springframework.web.servlet.config.annotation.EnableWebMvc; 
import org.springframework.web.servlet.view.InternalResourceViewResolver; 

import javax.annotation.Resource; 
import javax.sql.DataSource; 
import java.util.Properties; 

/** 
* Created by bjhl on 11/15/16. 
*/ 

@Configuration 
@EnableWebMvc 
@EnableTransactionManagement 
@ComponentScan("com.mytutorial") 
@PropertySource("classpath:jdbc.properties") 
public class WebConfig{ 

    private static final String PROPERTY_NAME_DATABASE_DRIVER = "db.driver"; 
    private static final String PROPERTY_NAME_DATABASE_PASSWORD = "db.password"; 
    private static final String PROPERTY_NAME_DATABASE_URL = "db.url"; 
    private static final String PROPERTY_NAME_DATABASE_USERNAME = "db.username"; 

    private static final String PROPERTY_NAME_HIBERNATE_DIALECT = "hibernate.dialect"; 
    private static final String PROPERTY_NAME_HIBERNATE_SHOW_SQL = "hibernate.show_sql"; 
    private static final String PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN = "entitymanager.packages.to.scan"; 

    @Resource 
    private Environment env; 

    @Bean 
    public DataSource dataSource() { 
     BasicDataSource dataSource = new BasicDataSource(); 

     dataSource.setDriverClassName(env.getRequiredProperty(PROPERTY_NAME_DATABASE_DRIVER)); 
     dataSource.setUrl(env.getRequiredProperty(PROPERTY_NAME_DATABASE_URL)); 
     dataSource.setUsername(env.getRequiredProperty(PROPERTY_NAME_DATABASE_USERNAME)); 
     dataSource.setPassword(env.getRequiredProperty(PROPERTY_NAME_DATABASE_PASSWORD)); 

     return dataSource; 
    } 

    @Bean 
    public LocalSessionFactoryBean sessionFactory() { 
     LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean(); 
     sessionFactoryBean.setDataSource(dataSource()); 
     sessionFactoryBean.setPackagesToScan(env.getRequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN)); 
     sessionFactoryBean.setHibernateProperties(hibProperties()); 
     return sessionFactoryBean; 
    } 

    private Properties hibProperties() { 
     Properties properties = new Properties(); 
     properties.put(PROPERTY_NAME_HIBERNATE_DIALECT, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_DIALECT)); 
     properties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL)); 
     return properties; 
    } 

    @Bean 
    public HibernateTransactionManager transactionManager() { 
     HibernateTransactionManager transactionManager = new HibernateTransactionManager(); 
     transactionManager.setSessionFactory(sessionFactory().getObject()); 
     return transactionManager; 
    } 

    @Bean 
    public ViewResolver viewResolver() { 
     InternalResourceViewResolver resolver = 
       new InternalResourceViewResolver(); 
     resolver.setPrefix("/WEB-INF/view/"); 
     resolver.setSuffix(".html"); 
     resolver.setExposeContextBeansAsAttributes(true); 
     return resolver; 
    } 


} 

如果我從PuzzleDAOImpl中刪除@Autowired,則編譯錯誤將消失,但這會導致數據庫連接出現其他問題。請誰可以救我!

+0

重寫這個'@Service( 「puzzleService」) 公共類PuzzleServiceImpl實現PuzzleService {}' 和'@Autowire PuzzleService puzzleService' – LynAs

+0

喜@ LynAs,謝謝你的迴應。進行上述修改後,我仍然有同樣的錯誤。似乎我的sessionFactory有問題。你有什麼主意嗎?很多thanx。 – Vigor

+0

爲什麼我認爲我的sessionFactory是錯誤的是因爲如果我從PuzzleDAOImpl中刪除@Autowired,編譯錯誤將會消失。 – Vigor

回答

0

需要解決以下在你的代碼,

@Service 
public class PuzzleServiceImpl implements PuzzleService { 

它應該是,

@Service("puzzleService") 
public class PuzzleServiceImpl implements PuzzleService { 

也是一樣的DAO /存儲庫組件,

@Repository 
public class PuzzleDAOImpl implements PuzzleDAO { 

應該

@Repository("puzzleDAO") 
public class PuzzleDAOImpl implements PuzzleDAO { 

編輯:嘗試排位賽你的會話工廠,如下所示,

 @Bean(name = "sessionFactory") 
    public LocalSessionFactoryBean sessionFactory() { 
      LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean(); 
      sessionFactoryBean.setDataSource(dataSource()); 
      sessionFactoryBean.setPackagesToScan(env.getRequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN)); 
      sessionFactoryBean.setHibernateProperties(hibProperties()); 
      return sessionFactoryBean; 
     } 
+0

嗨@TechBreak,感謝您的回覆,但仍然無效。看來我的sessionFactory出了問題。你有其他想法嗎?很多thanx。 – Vigor

+0

爲什麼我認爲我的sessionFactory是錯誤的是因爲如果我從PuzzleDAOImpl中刪除@Autowired,編譯錯誤將消失。 – Vigor

+0

@Vigor你放置了你的jdbc.properties?還把jdbc.properties的內容。看起來你的數據源沒有被創建。 – ScanQR

相關問題