SpringBoot

时间:2017-07-07 18:35:08

标签: java spring hibernate spring-mvc spring-boot

我正在学习 Spring Framework ,现在我正在尝试创建一个简单的 Spring Boot应用程序,它将列出数据库中的所有条目(使用 Hibernate )。

首先我在没有定义SessionFactory时出现问题,但我设法在Config Class中定义它。但是,当我尝试现在运行应用程序时,我收到以下错误:

Description:

The dependencies of some of the beans in the application context form a cycle:

   indexController (field private com.prvi.dao.CustomerDAO com.prvi.controllers.IndexController.customerDAO)
      ↓
   customerDAOImpl (field private org.hibernate.SessionFactory com.prvi.dao.CustomerDAOImpl.sessionFactory)
┌─────┐
|  sessionFactory defined in class path resource [com/prvi/ConfigPrvi.class]
└─────┘

基本上,我有 IndexController ,谁获得 GET / 请求,然后调用 customerDAO 获取客户列表,而customerDAO使用 sessionFactory 获取Session并对DB执行查询。 (为简单起见,我从应用程序中省略了服务层)

现在,我已经读过,当bean依赖于依赖于第一个bean的bean时会发生这种错误,从而产生循环依赖性。但是,我不明白我在这个循环中的位置以及如何解决它。此外,关于此主题的其他答案没有提供足够的信息来纠正错误。他们大多过于简单化了周期,这不是这里的情况。

这是我到目前为止所尝试的内容:

PrviApplication.java - Spring Boot的入口点

@SpringBootApplication
public class PrviApplication {
    public static void main(String[] args) {
        SpringApplication.run(PrviApplication.class, args);
    }
}

ConfigPrvi.java - 我的配置文件

@Configuration
@EnableAutoConfiguration
public class ConfigPrvi {
    @Bean
    public HibernateJpaSessionFactoryBean sessionFactory(EntityManagerFactory emf){
        HibernateJpaSessionFactoryBean factory = new HibernateJpaSessionFactoryBean();
        factory.setEntityManagerFactory(emf);
        return factory;
    }
}

IndexController.java - 我的Controller类,它处理GET /

@Controller
@RequestMapping("/")
public class IndexController {

    @Autowired
    private CustomerDAO customerDAO;

    @GetMapping("/")
    public String listCustomers(Model model){
        model.addAttribute("customers", customerDAO.getAllCustomers());
        return "index";
    }
}

CustomerDAO.java - 只是一个界面

public interface CustomerDAO {
    public List<Customer> getAllCustomers();
}

CustomerDAOImpl.java - 实现,从数据库中检索数据

@Repository
public class CustomerDAOImpl implements CustomerDAO {

    @Autowired
    private SessionFactory sessionFactory;

    @Transactional
    public List<Customer> getAllCustomers(){
        Session session = sessionFactory.getCurrentSession();
        Query<Customer> query = session.createQuery("from Customer order by lastName", Customer.class);
        List<Customer> customers = query.getResultList();
        return customers;
    }
}

这可能是在这里进行的循环:

主要 - &gt;控制器 - &gt; dao - &gt; sessionFactory - &gt; config - &gt;主

如果是这样,我怎样才能重写代码以便我摆脱它?

编辑:添加了pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.prvi</groupId>
    <artifactId>prvi</artifactId>
    <version>0.0.1</version>
    <packaging>jar</packaging>

    <name>prvi</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.4.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.2.10.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.2.10.Final</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

0 个答案:

没有答案