繁体   English   中英

通过“sessionFactory”未满足的依赖性; 没有可用的“org.hibernate.SessionFactory”类型的合格 bean

[英]Unsatisfied dependency through 'sessionFactory'; No qualifying bean of type 'org.hibernate.SessionFactory' available

我正在创建一个 spring-mvc 和 hibernate webapp。 我正在尝试通过创建项目(因此使用 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 class

@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 使用注释 model,因为在即将发布的版本之一中,HBM XML 方法将被 JPA orm.xml 方法取代。

我为此做了一个解决方法。

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

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

它开始工作了。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM