2015-06-21 66 views
0

我正在学习使用servlet3.0的hibernate和spring。 所以我做了关于替换* -context.xml的类。 (网上有很多样本,但我不想用xml。)Spring-Hibernate无法自动装载DAO层。 [没有资格的bean ...至少...]

首先,以下是我的配置类。

RootConfig - 具有关于数据库连接和JPA设置的信息。

@Configuration 
public class RootConfig { 

    @Value(value = "${jdbc.driverClassName}") 
    private String driverClassName; 

    @Value(value = "${jdbc.url}") 
    private String url; 

    @Value(value = "${jdbc.username}") 
    private String username; 

    @Value(value = "${jdbc.password}") 
    private String password; 

    @Value(value ="${jdbc.postgres.url}") 
    private String DB_URL; 


    private static final String RESOURCE_LOCATION = "resources"; 

    @Bean 
    public static PropertyPlaceholderConfigurer propertyPlaceholder() { 
     PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer(); 
     Resource[] resources = new ClassPathResource[]{ 
       new ClassPathResource(RESOURCE_LOCATION + File.separator + "properties" 
         + File.separator + "jdbc" + File.separator + "jdbc.properties") 
     }; 
     ppc.setLocations(resources); 
     return ppc; 
    } 

    @Bean 
    public DriverManagerDataSource dataSource() { 

     DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
     dataSource.setDriverClassName(driverClassName); 
     dataSource.setUrl(url); 
     dataSource.setUsername(username); 
     dataSource.setPassword(password); 
     return dataSource; 
    } 

    @Bean 
    public LocalContainerEntityManagerFactoryBean localContainerEntityFactoryManagerBean(){ 
     LocalContainerEntityManagerFactoryBean lcemfb = new LocalContainerEntityManagerFactoryBean(); 
     lcemfb.setDataSource(dataSource()); 
     lcemfb.setPackagesToScan("org.owls.posthibernate.person"); 
     lcemfb.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); 
     Properties jpaProperties = new Properties(); 
     jpaProperties.put("hibernate.dialect", PostgreSQL82Dialect.class.getName()); 
     jpaProperties.put("hibernate.show_sql", false); 
     jpaProperties.put("hibernate.format_sql", false); 
     //jpaProperties.put("hibernate.hbm2ddl.auto", "create"); 
     lcemfb.setJpaProperties(jpaProperties); 
     return lcemfb; 
    } 
}; 

的ServletConfig - 拥有的ViewResolver和ResourceHandler +上下文:组件扫描

@Configuration 
@EnableWebMvc 
@EnableAsync 
@ComponentScan(basePackages={ 
     "org.owls.posthibernate.person.dao" 
    , "org.owls.posthibernate.person.service" 
    , "org.owls.posthibernate.person.controller" 
    , "org.owls.posthibernate.init.controller" 
}, [email protected](Configuration.class)) 
public class ServletConfig extends WebMvcConfigurerAdapter { 

    @Bean 
    public ViewResolver viewResolver(){ 
     InternalResourceViewResolver irv = new InternalResourceViewResolver(); 
     irv.setPrefix("/WEB-INF/views/"); 
     irv.setSuffix(".jsp"); 
     return irv; 
    } 

    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
     registry.addResourceHandler("/resources/**") 
      .addResourceLocations("/resources/") 
      .setCachePeriod(31556926);; 
    } 
}; 

到这里,它的作品不错。当我运行这个代码时,没有错误。 我可以附@Service@controller,读取DB信息没有问题。

现在,我附上@Repository层。并吐出一个错误。以下是我的@Repository界面。

@Repository 
public interface PersonDAO extends CrudRepository<Person, Long> { 
    public List<Person> list(); 
    public List<Person> findByFamilyName (String familyName); 
}; 

由于我在ServletConfig.java中声明了内容:component-scan。我认为它应该工作。但不是:(

当我使用这个类,我只是@Autowired。如..

@Autowired 
    PersonDAO dao; 

我不知道为什么它不能找到该DAO类的bean。 感谢答案及以下是错误消息我在控制台了。

SEVERE: StandardWrapper.Throwable 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'personService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: org.owls.posthibernate.person.dao.PersonDAO org.owls.posthibernate.person.service.PersonService.dao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.owls.posthibernate.person.dao.PersonDAO] 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), @org.springframework.beans.factory.annotation.Qualifier(value=dao)} 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1210) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:755) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) 
    at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:663) 
    at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:535) 
    at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:489) 
    at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136) 
    at javax.servlet.GenericServlet.init(GenericServlet.java:160) 
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1280) 
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1091) 
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5176) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5460) 
    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:266) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: org.owls.posthibernate.person.dao.PersonDAO org.owls.posthibernate.person.service.PersonService.dao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.owls.posthibernate.person.dao.PersonDAO] 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), @org.springframework.beans.factory.annotation.Qualifier(value=dao)} 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:561) 
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331) 
    ... 26 more 

=====================编辑0622 =========== =============

首先,谢谢你的帮帮我。

我应该阅读那篇关于@Configuration的文章,但我决定回答另一个答案。

我得到了2点主要有,

  1. 我应该已经激活注解。
  2. 我应该实施PersonDAO。

这是我对问题1的回答。自从我的WebApplicationInitializer如下所示,我没有描述注解驱动。

public class Initializer implements WebApplicationInitializer { 

    @Override 
    public void onStartup(ServletContext arg0) throws ServletException { 

     AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); 

     ctx.register(RootConfig.class); 
     ctx.register(ServletConfig.class); 

     ctx.setServletContext(arg0); 
     Dynamic servlet = arg0.addServlet("dispatcher", new DispatcherServlet(ctx)); 
     servlet.addMapping("/"); 
     servlet.setLoadOnStartup(1); 
    } 
}; 

我觉得AnnotationConfigWebApplicationContext可以做同样的与annotation driven。 (我不确定,写完后我会去找)

第二个问题,我没有执行personDAO的原因是我不想使用实现类。我曾经使用MyBatis Mapper接口,所以我相信Hibernate可以做这样的接口事情。如果没有在Hibernate中实现,是否没有办法注入DAO?

我一直在寻找的联系是 http://devcrumb.com/hibernate/spring-data-jpa-hibernate-maven(我不知道它是确定张贴链接在这里)

,它使用没有实现类@Repository。

+0

[理解spring @Configuration类的用法](http://stackoverflow.com/questions/24014919/understanding-spring-configuration-class-usage) – OO7

+0

@ OO7我认为我的问题有点扩大了范围。它不仅处理Java'@ Cofigurations',还处理'@ Repository'。我认为这里的主要问题是CRUDRepository如何在没有实现的情况下注入,如MyBatis Mapper。 –

回答

0

在上面的代码中没有看到任何PersonDAO的实现。理想情况下应该有一些实现。

一旦你有这样的实施;然后用@Controller(“dao”)对其进行注释。

0

这意味着在你的服务班你错过了一些东西。你的课程不是自动装配的,因为你得到了一个例外。

为此,您的PersonDAO应该与服务实现类连线。

在您的PersionService实现类中添加@Service注释。

+0

感谢您的回答。但这里的主要问题不是服务bean。这都是关于刀豆。我正在观看的博客使用@Repository注释来进行交互。链接连接到主帖子。谢谢。 –

0

第一个@ComponentScan没有激活@Autowired注释,它只激活@Component, @Service, @Controller and @ Repository annotation,添加AnnotationConfig来激活它。第二,你没有任何实现PersonDao类的实现,所以Spring无法为它找到任何合格的bean。

+0

我编辑了这篇文章。你会检查吗?我希望你能为我添加一些参考链接。感谢:D –

相关问题