无法自动装配字段:private org.hibernate.SessionFactory Hibernate 和 Spring
Could not autowire field: private org.hibernate.SessionFactory Hibernate and Spring
我在服务器 Tomcat 上部署项目后遇到此错误。我发现了很多类似的问题,但我没有找到问题的答案。
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'categoryDaoDbImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.hibernate.SessionFactory ua.com.goit.gojava7.kikstarter.dao.database.CategoryDaoDbImpl.sessionFactory; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [applicationContext.xml]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: @OneToOne or @ManyToOne on ua.com.goit.gojava7.kikstarter.domain.Payment.projectId references an unknown entity: int
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
at org.springframework.beans.factory.support.AbstractBeanFactory.getObject(AbstractBeanFactory.java:305)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:301)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:835)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:537)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:446)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:328)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd">
<context:property-placeholder location="classpath:config.properties" />
<context:component-scan base-package="ua.com.goit.gojava7.kikstarter.dao.database" />
<bean id="basicDataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.dataBaseUrl}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="basicDataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
<prop key="hibernate.show_sql">false</prop>
</props>
</property>
<property name="annotatedClasses">
<list>
<value>ua.com.goit.gojava7.kikstarter.domain.Quote</value>
<value>ua.com.goit.gojava7.kikstarter.domain.Category</value>
<value>ua.com.goit.gojava7.kikstarter.domain.Project</value>
<value>ua.com.goit.gojava7.kikstarter.domain.Payment</value>
<value>ua.com.goit.gojava7.kikstarter.domain.Reward</value>
</list>
</property>
</bean>
CategoryDaoDbImpl class
package ua.com.goit.gojava7.kikstarter.dao.database;
import java.util.List;
import org.hibernate.SessionFactory;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.hibernate.Criteria;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import ua.com.goit.gojava7.kikstarter.dao.CategoryDao;
import ua.com.goit.gojava7.kikstarter.domain.Category;
@Repository
public class CategoryDaoDbImpl implements CategoryDao {
@Autowired
private SessionFactory sessionFactory;
@SuppressWarnings("unchecked")
@Transactional
@Override
public List<Category> getAll() {
Session session=sessionFactory.openSession();
Criteria criteria=session.createCriteria(Category.class);
List<Category> categories=criteria.list();
session.close();
return categories;
}
@Transactional
@Override
public Category getCategory(int id) {
Session session=sessionFactory.openSession();
Criteria criteria=session.createCriteria(Category.class);
criteria.add(Restrictions.eq("id", id));
Category category=(Category) criteria.uniqueResult();
session.close();
return category;
}
}
类别class
package ua.com.goit.gojava7.kikstarter.domain;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
@Entity
@Table(name = "categories")
public class Category {
@Id
@SequenceGenerator(name = "SEQ_GEN", sequenceName = "seq_id", allocationSize = 10)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_GEN")
private int id;
@Column(name = "name")
private String name;
@OneToMany
private Set<Project> projects;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public Set<Project> getProjects() {
return projects;
}
public void setProjects(Set<Project> projects) {
this.projects = projects;
}
@Override
public String toString() {
return "ID: " + id + "; Name: " + name;
}
}
项目class
package ua.com.goit.gojava7.kikstarter.domain;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
@Entity
@Table(name = "projects")
public class Project {
@Id
@SequenceGenerator(name = "SEQ_GEN", sequenceName = "seq_id", allocationSize = 10)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_GEN")
private int id;
@ManyToOne
@JoinColumn(name = "category_id")
private Category category;
@Column(name = "name")
private String name;
@Column(name = "general_description")
private String generalDescription;
@Column(name = "full_description")
private String fullDescription;
@Column(name = "video_link")
private String videoLink;
@Column(name = "required_sum")
private int requiredSum;
@Column(name = "collected_sum")
private int collectedSum;
@Column(name = "days_left")
private int endOfDays;
public int getId() {
return id;
}
public Category getCategory() {
return category;
}
public String getName() {
return name;
}
public String getGenerelDescription() {
return generalDescription;
}
public String getFullDescription() {
return fullDescription;
}
public String getVideoLink() {
return videoLink;
}
public int getRequiredSum() {
return requiredSum;
}
public int getCollectedSum() {
return collectedSum;
}
public int getEndOfDays() {
return endOfDays;
}
public void setId(int id) {
this.id = id;
}
public void setCategory(Category category) {
this.category = category;
}
public void setName(String projectName) {
this.name = projectName;
}
public void setGeneralDescription(String generalDescription) {
this.generalDescription = generalDescription;
}
public void setFullDescription(String fullDescription) {
this.fullDescription = fullDescription;
}
public void setVideoLink(String videoLink) {
this.videoLink = videoLink;
}
public void setRequiredSum(int requiredSum) {
this.requiredSum = requiredSum;
}
public void setCollectedSum(int collectedAmount) {
this.collectedSum = collectedAmount;
}
public void setSumFromUser(int enteredAmount) {
collectedSum += enteredAmount;
}
public void setEndOfDays(int endOfDays) {
this.endOfDays = endOfDays;
}
@Override
public String toString() {
return "Project: name: " + name + "; general description: " + generalDescription + "; full description: "
+ fullDescription + "; video link: " + videoLink + "; required sum: " + requiredSum
+ "; collected sum: " + collectedSum + "; days left: " + endOfDays;
}
}
这对于评论来说太长了,根据你的评论,我认为给你一个更长的解释可能会有所帮助。
阅读 Java 异常时,有两点需要牢记。
- The Stack. Code execution is tracked by adding 'frames' to the stack. Every time you call a method, a new frame is 'pushed' onto the stack. This is how, when an exception is thrown, you are able to get the methods that were called that led up to the exception (called the Stack Trace).
- Chained Exceptions。在Java中,当抛出异常时,可以指定异常的'cause'。这是一种跟踪异常的堆栈跟踪的方法,'caused' 正在抛出的新异常。
Spring 框架因大量使用链式异常而臭名昭著(我个人认为这是一个很好的品质),这使得读取从框架返回的错误有点棘手。棘手的是 Stack Trace 的顺序和 Chained Exceptions 的顺序本质上是 reversed.
也就是说有了Stack Trace,最近执行的代码在最上面。但是,对于链式异常,抛出的 'first' 异常位于底部。
所以您需要做的是查找抛出的 'first' 异常,以找到异常的真正根本原因并修复该异常。 question/answer 已经有一个很好的 further explains 我在说什么。
因此查看您的具体示例(并将其简化以调出您需要注意的结构)我们看到:
BeanCreationException: Error creating bean with name 'categoryDaoDbImpl': Injection of autowired dependencies failed; **nested exception is**
|
|-> BeanCreationException: Could not autowire field: private SessionFactory CategoryDaoDbImpl.sessionFactory; **nested exception is**
|
|-> BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [applicationContext.xml]: Invocation of init method failed; **nested exception is**
|
|-> AnnotationException: @OneToOne or @ManyToOne on Payment.projectId references an unknown entity: int at
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214) at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543) at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) at
org.springframework.beans.factory.support.AbstractBeanFactory.getObject(AbstractBeanFactory.java:305) at
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) at
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:301) at
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196) at
org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772) at
org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:835) at
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:537) at
org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:446) at
org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:328) at
org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
当您看到 嵌套异常是 时,您正在处理链式异常。因此,您实际遇到的是 一个 导致问题的异常,这是 Payment
对象上的映射问题;特别是 projectId
字段。
所以当你问
What about Could not autowire field: private org.hibernate.SessionFactory and Error creating bean with name 'categoryDaoDbImpl' I have to create bean with name 'categoryDaoDbImpl' in file applicationContext.xml?
希望您现在清楚了,您不必对 "first" 三个 BeanCreationException
做任何事情,因为它们都是 由 根引起的AnnotationException
我在服务器 Tomcat 上部署项目后遇到此错误。我发现了很多类似的问题,但我没有找到问题的答案。
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'categoryDaoDbImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.hibernate.SessionFactory ua.com.goit.gojava7.kikstarter.dao.database.CategoryDaoDbImpl.sessionFactory; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [applicationContext.xml]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: @OneToOne or @ManyToOne on ua.com.goit.gojava7.kikstarter.domain.Payment.projectId references an unknown entity: int at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) at org.springframework.beans.factory.support.AbstractBeanFactory.getObject(AbstractBeanFactory.java:305) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:301) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:835) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:537) at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:446) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:328) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd">
<context:property-placeholder location="classpath:config.properties" />
<context:component-scan base-package="ua.com.goit.gojava7.kikstarter.dao.database" />
<bean id="basicDataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.dataBaseUrl}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="basicDataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
<prop key="hibernate.show_sql">false</prop>
</props>
</property>
<property name="annotatedClasses">
<list>
<value>ua.com.goit.gojava7.kikstarter.domain.Quote</value>
<value>ua.com.goit.gojava7.kikstarter.domain.Category</value>
<value>ua.com.goit.gojava7.kikstarter.domain.Project</value>
<value>ua.com.goit.gojava7.kikstarter.domain.Payment</value>
<value>ua.com.goit.gojava7.kikstarter.domain.Reward</value>
</list>
</property>
</bean>
CategoryDaoDbImpl class
package ua.com.goit.gojava7.kikstarter.dao.database;
import java.util.List;
import org.hibernate.SessionFactory;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.hibernate.Criteria;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import ua.com.goit.gojava7.kikstarter.dao.CategoryDao;
import ua.com.goit.gojava7.kikstarter.domain.Category;
@Repository
public class CategoryDaoDbImpl implements CategoryDao {
@Autowired
private SessionFactory sessionFactory;
@SuppressWarnings("unchecked")
@Transactional
@Override
public List<Category> getAll() {
Session session=sessionFactory.openSession();
Criteria criteria=session.createCriteria(Category.class);
List<Category> categories=criteria.list();
session.close();
return categories;
}
@Transactional
@Override
public Category getCategory(int id) {
Session session=sessionFactory.openSession();
Criteria criteria=session.createCriteria(Category.class);
criteria.add(Restrictions.eq("id", id));
Category category=(Category) criteria.uniqueResult();
session.close();
return category;
}
}
类别class
package ua.com.goit.gojava7.kikstarter.domain;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
@Entity
@Table(name = "categories")
public class Category {
@Id
@SequenceGenerator(name = "SEQ_GEN", sequenceName = "seq_id", allocationSize = 10)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_GEN")
private int id;
@Column(name = "name")
private String name;
@OneToMany
private Set<Project> projects;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public Set<Project> getProjects() {
return projects;
}
public void setProjects(Set<Project> projects) {
this.projects = projects;
}
@Override
public String toString() {
return "ID: " + id + "; Name: " + name;
}
}
项目class
package ua.com.goit.gojava7.kikstarter.domain;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
@Entity
@Table(name = "projects")
public class Project {
@Id
@SequenceGenerator(name = "SEQ_GEN", sequenceName = "seq_id", allocationSize = 10)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_GEN")
private int id;
@ManyToOne
@JoinColumn(name = "category_id")
private Category category;
@Column(name = "name")
private String name;
@Column(name = "general_description")
private String generalDescription;
@Column(name = "full_description")
private String fullDescription;
@Column(name = "video_link")
private String videoLink;
@Column(name = "required_sum")
private int requiredSum;
@Column(name = "collected_sum")
private int collectedSum;
@Column(name = "days_left")
private int endOfDays;
public int getId() {
return id;
}
public Category getCategory() {
return category;
}
public String getName() {
return name;
}
public String getGenerelDescription() {
return generalDescription;
}
public String getFullDescription() {
return fullDescription;
}
public String getVideoLink() {
return videoLink;
}
public int getRequiredSum() {
return requiredSum;
}
public int getCollectedSum() {
return collectedSum;
}
public int getEndOfDays() {
return endOfDays;
}
public void setId(int id) {
this.id = id;
}
public void setCategory(Category category) {
this.category = category;
}
public void setName(String projectName) {
this.name = projectName;
}
public void setGeneralDescription(String generalDescription) {
this.generalDescription = generalDescription;
}
public void setFullDescription(String fullDescription) {
this.fullDescription = fullDescription;
}
public void setVideoLink(String videoLink) {
this.videoLink = videoLink;
}
public void setRequiredSum(int requiredSum) {
this.requiredSum = requiredSum;
}
public void setCollectedSum(int collectedAmount) {
this.collectedSum = collectedAmount;
}
public void setSumFromUser(int enteredAmount) {
collectedSum += enteredAmount;
}
public void setEndOfDays(int endOfDays) {
this.endOfDays = endOfDays;
}
@Override
public String toString() {
return "Project: name: " + name + "; general description: " + generalDescription + "; full description: "
+ fullDescription + "; video link: " + videoLink + "; required sum: " + requiredSum
+ "; collected sum: " + collectedSum + "; days left: " + endOfDays;
}
}
这对于评论来说太长了,根据你的评论,我认为给你一个更长的解释可能会有所帮助。
阅读 Java 异常时,有两点需要牢记。
- The Stack. Code execution is tracked by adding 'frames' to the stack. Every time you call a method, a new frame is 'pushed' onto the stack. This is how, when an exception is thrown, you are able to get the methods that were called that led up to the exception (called the Stack Trace).
- Chained Exceptions。在Java中,当抛出异常时,可以指定异常的'cause'。这是一种跟踪异常的堆栈跟踪的方法,'caused' 正在抛出的新异常。
Spring 框架因大量使用链式异常而臭名昭著(我个人认为这是一个很好的品质),这使得读取从框架返回的错误有点棘手。棘手的是 Stack Trace 的顺序和 Chained Exceptions 的顺序本质上是 reversed.
也就是说有了Stack Trace,最近执行的代码在最上面。但是,对于链式异常,抛出的 'first' 异常位于底部。
所以您需要做的是查找抛出的 'first' 异常,以找到异常的真正根本原因并修复该异常。 question/answer 已经有一个很好的 further explains 我在说什么。
因此查看您的具体示例(并将其简化以调出您需要注意的结构)我们看到:
BeanCreationException: Error creating bean with name 'categoryDaoDbImpl': Injection of autowired dependencies failed; **nested exception is**
|
|-> BeanCreationException: Could not autowire field: private SessionFactory CategoryDaoDbImpl.sessionFactory; **nested exception is**
|
|-> BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [applicationContext.xml]: Invocation of init method failed; **nested exception is**
|
|-> AnnotationException: @OneToOne or @ManyToOne on Payment.projectId references an unknown entity: int at
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214) at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543) at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) at
org.springframework.beans.factory.support.AbstractBeanFactory.getObject(AbstractBeanFactory.java:305) at
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) at
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:301) at
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196) at
org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772) at
org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:835) at
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:537) at
org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:446) at
org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:328) at
org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
当您看到 嵌套异常是 时,您正在处理链式异常。因此,您实际遇到的是 一个 导致问题的异常,这是 Payment
对象上的映射问题;特别是 projectId
字段。
所以当你问
What about Could not autowire field: private org.hibernate.SessionFactory and Error creating bean with name 'categoryDaoDbImpl' I have to create bean with name 'categoryDaoDbImpl' in file applicationContext.xml?
希望您现在清楚了,您不必对 "first" 三个 BeanCreationException
做任何事情,因为它们都是 由 根引起的AnnotationException