Java 从ClassPathXmlApplicationContext切换到MVC web风格上下文实现时未定义SessionFactory bean(无此类bean)

Java 从ClassPathXmlApplicationContext切换到MVC web风格上下文实现时未定义SessionFactory bean(无此类bean),java,xml,spring,hibernate,spring-mvc,Java,Xml,Spring,Hibernate,Spring Mvc,我试图将Hibernate设置为在Spring中运行,以便在一个简单的web应用程序中管理事务。我已经阅读了Spring教程和文档,并使用和XMLApplicationContext引用定义bean的xml文件,成功地建立了一个工作玩具示例。现在,我切换到SpringMVC,并使用了完全相同的代码和bean定义。我已经通过web.xml链接了我的bean被声明的xml文件,但是我得到了一些奇怪的行为 以下是我的测试示例的粘贴,以供参考: 以下是我的相关代码: web.xml: <?xml

我试图将Hibernate设置为在Spring中运行,以便在一个简单的web应用程序中管理事务。我已经阅读了Spring教程和文档,并使用和XMLApplicationContext引用定义bean的xml文件,成功地建立了一个工作玩具示例。现在,我切换到SpringMVC,并使用了完全相同的代码和bean定义。我已经通过web.xml链接了我的bean被声明的xml文件,但是我得到了一些奇怪的行为

以下是我的测试示例的粘贴,以供参考:

以下是我的相关代码:

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>

    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>
</web-app>
主应用程序:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MyApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}
MainController.java:

@Controller
public class MainController implements ApplicationContextAware {

    private ApplicationContext context;
    private HibernateTestDao dao;
    private SessionFactory sessionFactory;

    @Override
    public void setApplicationContext(org.springframework.context.ApplicationContext applicationContext) throws BeansException {
        this.context = applicationContext;
    }

    //@Autowired
    public void setDao(HibernateTestDao dao) {
        this.dao = dao;
    }

    @Autowired
    public void setSessionFactory(SessionFactory factory) {
        this.sessionFactory = factory;
    }

    @RequestMapping(value="/test", method= RequestMethod.GET)
    public String test(Model model) {
        model.addAttribute("name", "testing!");

        System.out.println(context.getBeanDefinitionCount());
        List<String> beans = new ArrayList<String>();
        for (String s : context.getBeanDefinitionNames())
            beans.add(s);

        Collections.sort(beans);
        for (String s : beans)
            System.out.println(s);

        //dao.loadEntries();

        return "test";
    }

    @RequestMapping(value="/", method= RequestMethod.GET)
    public String dashboard() {
        return "dashboard";
    }

    @RequestMapping(value="/view", method= RequestMethod.GET)
    public String edit() {
        return "view_as_form";
    }
}
最初在切换之后,我遇到以下错误:

DataSourceBeanCreationException: Cannot determine embedded database driver class for database type NONE.
我通过将字段添加到application.properties文件中修复了该问题。但在这之后,我成功地完成了所有测试,现在当我尝试将SessionFactory bean注入到测试类中时,我得到了一个未定义此类bean的异常。我已经阅读了尽可能多的文档,但我找不到发生这种情况的原因

前面的数据源创建异常可能提供了一个线索,说明为什么会发生这种情况?我认为我得到这个错误是很奇怪的,因为我在bean本身中定义了这些信息,而不是在外部配置中。是否正在创建一个不包含所有bean的servlet上下文?是否未读取applicationContext.xml?(它似乎被理解为templateEngine和defaultTemplateResolver bean,当我打印出它们时就会出现)


我绞尽脑汁想弄明白这件事。我们将非常感谢您提供的任何帮助或指导

您已经创建了一个SpringBoot应用程序,而不是传统的SpringMVC应用程序。Spring Boot不会使用Web.xml,实际上会忽略applicationContext.xml中的所有配置。请阅读SpringBoot文档,它是SpringBoot中的所有JavaConfig。虽然你可以导入xml配置,但如果你创建新的应用程序,你不应该。这是关于Spring数据Jpa的Spring引导。您创建了SpringBoot应用程序,而不是传统的SpringMVC应用程序。Spring Boot不会使用Web.xml,实际上会忽略applicationContext.xml中的所有配置。请阅读SpringBoot文档,它是SpringBoot中的所有JavaConfig。虽然你可以导入xml配置,但如果你创建新的应用程序,你不应该。这里是关于Spring引导和Spring数据Jpa。
@Controller
public class MainController implements ApplicationContextAware {

    private ApplicationContext context;
    private HibernateTestDao dao;
    private SessionFactory sessionFactory;

    @Override
    public void setApplicationContext(org.springframework.context.ApplicationContext applicationContext) throws BeansException {
        this.context = applicationContext;
    }

    //@Autowired
    public void setDao(HibernateTestDao dao) {
        this.dao = dao;
    }

    @Autowired
    public void setSessionFactory(SessionFactory factory) {
        this.sessionFactory = factory;
    }

    @RequestMapping(value="/test", method= RequestMethod.GET)
    public String test(Model model) {
        model.addAttribute("name", "testing!");

        System.out.println(context.getBeanDefinitionCount());
        List<String> beans = new ArrayList<String>();
        for (String s : context.getBeanDefinitionNames())
            beans.add(s);

        Collections.sort(beans);
        for (String s : beans)
            System.out.println(s);

        //dao.loadEntries();

        return "test";
    }

    @RequestMapping(value="/", method= RequestMethod.GET)
    public String dashboard() {
        return "dashboard";
    }

    @RequestMapping(value="/view", method= RequestMethod.GET)
    public String edit() {
        return "view_as_form";
    }
}
public class HibernateTestDao {

    private SessionFactory sessionFactory;

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    @SuppressWarnings("unchecked")
    public List<TestData> loadEntries() {

        Session session = this.sessionFactory.getCurrentSession();
        List<TestData> items = session.createQuery("from TestData").list();
        return items;
    }
}
@Entity
@Table(name="test")
public class TestData {

    @Id
    @Column(name="id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    private String value1;
    private Date value2;

    public Date getValue2() {
        return value2;
    }

    public void setValue2(Date value2) {
        this.value2 = value2;
    }

    public String getValue1() {
        return value1;
    }

    public void setValue1(String value1) {
        this.value1 = value1;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}
DataSourceBeanCreationException: Cannot determine embedded database driver class for database type NONE.