2016-01-27 3 views
0

Я получил эту ошибку после развертывания проекта на своем сервере Tomcat. Я нашел много похожих вопросов, но я не нашел ответа на мою проблему.Не удалось создать поле autowire: private org.hibernate.SessionFactory Hibernate и Spring

org.springframework.beans.factory.BeanCreationException: Ошибка при создании боба с именем 'categoryDaoDbImpl': Инъекция autowired зависимости не удался; Вложенное исключение - org.springframework.beans.factory.BeanCreationException: Не удалось autowire field: private org.hibernate.SessionFactory ua.com.goit.gojava7.kikstarter.dao.database.CategoryDaoDbImpl.sessionFactory; Вложенное исключение - org.springframework.beans.factory.BeanCreationException: Ошибка создания компонента с именем sessionFactory, определенным в ресурсе пути к ключу [applicationContext.xml]: вызов метода init не удался; Вложенное исключение - org.hibernate.AnnotationException: @OneToOne или @ManyToOne на странице ua.com.goit.gojava7.kikstarter.domain.Payment.projectId ссылается на неизвестный объект: int на org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor. postProcessPropertyValues ​​(AutowiredAnnotationBeanPostProcessor.java:334) на org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean (AbstractAutowireCapableBeanFactory.java:1214) на 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 $ 1.getObject (AbstractBeanFact ory.java:305) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:230) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:301) на org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:196) в org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons (DefaultListableBeanFactory.java:772) в org.springframework. context.support.AbstractApplicationContext.finishBeanFactoryInitialization (AbstractApplicationContext.java:835) at org.springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java:537) at org.springframework.web.context.Contex tLoader.configureAndRefreshWebApplicationContext (ContextLoader.java:446) на org.springframework.web.context.ContextLoader.initWebApplicationContext (ContextLoader.java:328) в 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

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; 
    } 
} 

класс Категория

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; 
    } 
} 

класс проекта

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; 
    } 
} 
+3

Пожалуйста, показать полный трассировки стека и указать, какие версию Hibernate, которую вы используете. –

+0

Кроме того, ваш dao ошибочен, не используйте 'openSession()' use 'getCurrentSession()' вместо этого. Теперь, после нескольких запросов, ваше приложение закроется, потому что вы открываете новые сеансы вне контроля весны. –

+0

@ M.Deinum Я думаю, что это нормально, если он не будет смешивать весенний ('@ Transactional') код и собственный код. Он просто открывает и закрывает сеанс. Более серьезная проблема заключается в том, что он не использует транзакции для данных запроса :) –

ответ

2

Это было бы слишком долго для комментария и основанный на ваш комментарий, я думаю, что это может помочь, чтобы дать вам более пространное объяснение.

При чтении исключений Java есть несколько вещей, о которых следует помнить.

  1. The Stack. Выполнение кода отслеживается путем добавления «кадров» в стек. Каждый раз, когда вы вызываете метод, новый фрейм «толкается» в стек. Таким образом, когда генерируется исключение, вы можете получить методы, которые были вызваны, которые привели к исключению (так называемый Stack Trace).
  2. Chained Exceptions. В Java, когда генерируется исключение, можно указать «причину» исключения. Это способ отслеживать трассировку стека исключения, которое «вызвало» новое исключение, которое бросается.

Spring Framework известен тем, что свободен с использованием цепочки исключений (и я лично считаю, что это хорошее качество), что делает чтение ошибок, возвращенных из фреймворка немного сложным. Что делает его сложным, так это то, что порядок трассировки стека и порядок Chained Exceptions по существу отменены.

То есть, с помощью Stack Trace самый последний выполненный код находится наверху. Однако, с цепочки исключений, «первое» исключение, которое было брошено, находится внизу.

Итак, вам нужно искать «первое» исключение, которое было брошено, чтобы найти истинную основную причину исключения и исправить это. Есть довольно хороший вопрос/ответ уже о том, что 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$1.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.

Так что, когда вы спросите

насчет Не удалось autowire поле: частная org.hibernate.SessionFactory и Ошибка создания bean с именем 'categoryDaoDbImpl' Мне нужно создать bean-компонент с именем 'categoryDaoDbImpl' в файле applicationContext.xml?

Надеюсь, теперь ясно, что вы не должны делать ничего о «первой» три BeanCreationException, потому что те все вызваны корневой AnnotationException

+1

Я не хочу звучать снисходительно; поэтому я прошу прощения, если я сойду с этого пути. По правде говоря, я долгое время работал с Spring Framework, и это одна вещь, которую я вижу, когда новые разработчики запутываются снова и снова. – FGreg

+0

Благодарим вас за прекрасный ответ и объяснение! На самом деле я не понял, как найти необходимое исключение из многих строк трассировки стека. Но после вашего подробного объяснения вопрос стал намного яснее для меня. Мне, как послушнику, трудно найти правильный ответ. Вы дали мне очень четкое объяснение сложной темы для меня. Большое спасибо! – Vladimir

+0

@ Владимир Рад, я мог бы помочь. Если вы чувствуете, что я достаточно ответил на ваш вопрос, принято [голосовать и/или принимать] (http://stackoverflow.com/help/someone-answers) ответ, используя стрелки или галочку, найденную слева от ответ. – FGreg

Смежные вопросы