我正在学习使用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点主要有,
- 我应该已经激活注解。
- 我应该实施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。
[理解spring @Configuration类的用法](http://stackoverflow.com/questions/24014919/understanding-spring-configuration-class-usage) – OO7
@ OO7我认为我的问题有点扩大了范围。它不仅处理Java'@ Cofigurations',还处理'@ Repository'。我认为这里的主要问题是CRUDRepository如何在没有实现的情况下注入,如MyBatis Mapper。 –