通过"会话工厂"满足依赖关系;没有可用的类型为"org.hibernate.SessionFactory"的合格 Bean



我正在创建一个springmvc和hibernate Web应用程序。我正试图通过创建项目(因此使用xml配置(来测试书中阅读的文本。这种类型的问题以前被问过,但我无法让我的项目得到答案。当我到达终点时,我得到以下错误:

[WARNING] Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'categoryController': Unsatisfied dependency expressed through field 'categoryService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'categoryServiceImpl': Unsatisfied dependency expressed through field 'categoryDAO'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'categoryDAOImpl': Unsatisfied dependency expressed through field 'sessionFactory'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.hibernate.SessionFactory' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=sessionFactory)}
[ERROR] Context initialization failed

这是配置类

@Configuration
@ComponentScan(basePackages= {"pizzaml.rest", "pizzaml.service", "pizzaml.dao"})
@EnableWebMvc
public class AppConfig {

@Bean(name="sessionFactory")
public SessionFactory sessionFactory( @Qualifier("dataSource") DataSource dataSource) throws MalformedURLException {
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();

sessionFactory.setDataSource(dataSource);
sessionFactory.setConfigLocation(new FileUrlResource("/hibernate-cfg.xml"));
return sessionFactory.getObject();
}

@Bean(name="dataSource")
public DataSource dataSource( @Value("{db.user}") String user, @Value("{db.pass}") String pass, @Value("{db.url}") String url, @Value("{db.driverclass}") String driverClass) {
BasicDataSource datasource = new BasicDataSource();
datasource.setDriverClassName(driverClass);
datasource.setUsername(user);
datasource.setPassword(pass);
datasource.setUrl(url);

return datasource;
}

}

这是hibernate-cfg.xml

<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

<session-factory>
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<mapping resource="pizzaml/entity/Category.hbm.xml"></mapping>
</session-factory>

</hibernate-configuration>

DAO-

@Repository
public class CategoryDAOImpl implements CategoryDAO {

@Autowired
@Qualifier("sessionFactory")
SessionFactory sessionFactory;
@Override
public String addCategory(String categoryname) throws BusinessProcessException {

Session session = sessionFactory.openSession();

Query query = session.getNamedQuery("Category.byName");
List<Category> list = query.list();

if(Objects.nonNull(list) && (!list.isEmpty()) )
throw new BusinessProcessException("Category already exists!");

Category category = new Category();
category.setName(categoryname);

session.save(category);

session.flush();

session.close();

return AppCodes.SUCCESS;
}
}

pom.xml

<dependencies>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>

<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>

<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.22.Final</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.8.0</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-orm -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.3</version>
</dependency>


</dependencies>

<build>

<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>    
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.3</version>
<configuration>
<outputDirectory>./target</outputDirectory>
</configuration>
</plugin>

<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>4500</port>
<path>/</path>
</configuration>
</plugin>

</plugins>

您的Hibernate映射可能有问题,但由于您没有发布整个堆栈,这将有助于了解错误所在,因此没有什么可以帮助您的。除此之外,我强烈建议您使用Hibernate的注释模型,因为在即将发布的版本中,HBM XML方法将被JPA orm.XML方法所取代。

我为此做了一个变通方法。

而不是执行localSessionFactoryBean.getObject((来获取hibernate会话工厂。

我使用hibernate的配置类来创建会话工厂对象。唯一的问题是我想提供自己的数据源。为此,我创建了一个实现ConnectionProvider接口的类。并在hibernate.cfg.xml中设置属性-hibernate.connection.provider_class。

它开始发挥作用。

不过,我同意其他评论,hbm.xml是一种古老的做事方式。我将学习注释,并开始在未来的项目中使用它们。

最新更新