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