2017-03-17 58 views
0

我使用Spring Boot創建一個Web服務,其中我有一個店鋪列表與他們的costumers和他們的卡。很容易也許Spring Boot'sessionFactory'或'hibernateTemplate'是必需的

我使用hibernate 4連接到本地MySQL數據庫。

的問題是,我得到這個錯誤(這個問題已經提到):控制器,DAO模式和服務:

2017-03-17 17:46:45.024 ERROR 2055 --- [   main] o.s.boot.SpringApplication    : Application startup failed 

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'cardController': Unsatisfied dependency expressed through field 'cardService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'cardServiceImpl': Unsatisfied dependency expressed through field 'cardDao'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cardDao' defined in file [/Users/mitro/Documents/SpringBoot/FidelityCard/target/classes/net/mitro/dao/CardDaoImpl.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:588) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:866) ~[spring-context-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542) ~[spring-context-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) ~[spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE] 
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737) [spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE] 
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:370) [spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) [spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1162) [spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1151) [spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE] 
    at net.mitro.FidelitycardApplication.main(FidelitycardApplication.java:13) [classes/:na] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_112] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_112] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_112] 
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_112] 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) [idea_rt.jar:na] 
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'cardServiceImpl': Unsatisfied dependency expressed through field 'cardDao'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cardDao' defined in file [/Users/mitro/Documents/SpringBoot/FidelityCard/target/classes/net/mitro/dao/CardDaoImpl.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:588) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:208) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1138) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    ... 24 common frames omitted 
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cardDao' defined in file [/Users/mitro/Documents/SpringBoot/FidelityCard/target/classes/net/mitro/dao/CardDaoImpl.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:208) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1138) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    ... 37 common frames omitted 
Caused by: java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required 
    at org.springframework.orm.hibernate4.support.HibernateDaoSupport.checkDaoConfig(HibernateDaoSupport.java:117) ~[spring-orm-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.dao.support.DaoSupport.afterPropertiesSet(DaoSupport.java:44) ~[spring-tx-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    ... 47 common frames omitted 

的代碼中是包分配。類非常相似,所以我只會發布其中的一個。

CardController

package net.mitro.controller; 

import net.mitro.service.interfaces.CardService; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.RestController; 

import java.util.List; 

/** 
* Created by mitro on 15/03/2017. 
*/ 
@RestController 
@RequestMapping("/cards") 
public class CardController { 

    @Autowired 
    private CardService cardService; 

    @RequestMapping(method = RequestMethod.GET) 
    public List getAllShops(){ 
     return cardService.getAllCards(); 
    } 
} 

CardServiceImpl

package net.mitro.service; 

import net.mitro.dao.interfaces.CardDao; 
import net.mitro.service.interfaces.CardService; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Service; 

import java.util.List; 

/** 
* Created by mitro on 15/03/2017. 
*/ 
@Service 
public class CardServiceImpl implements CardService{ 

    @Autowired 
    private CardDao cardDao; 

    @Override 
    public List getAllCards(){ 
     return this.cardDao.getAllCards(); 
    } 
} 

CardDaoImpl

package net.mitro.dao; 

import net.mitro.dao.interfaces.CardDao; 
import net.mitro.model.Card; 
import org.springframework.dao.support.DataAccessUtils; 
import org.springframework.orm.hibernate4.support.HibernateDaoSupport; 
import org.springframework.stereotype.Repository; 

import javax.transaction.Transactional; 
import java.util.List; 

/** 
* Created by mitro on 15/03/2017. 
*/ 
@Repository("cardDao") 
public class CardDaoImpl extends HibernateDaoSupport implements CardDao{ 

    @Override 
    @Transactional 
    public List getAllCards() { 
     return getHibernateTemplate().find("from card"); 
    } 

    @Override 
    @Transactional 
    public int cardCount() { 
     return DataAccessUtils.intResult(getHibernateTemplate().find("select count(*) from card")); 
    } 

    @Override 
    @Transactional 
    public void delete(int id) { 
     getHibernateTemplate().delete(this.findById(id)); 
    } 

    @Override 
    @Transactional 
    public Card findById(int id) { 
     return (Card) getHibernateTemplate().get(Card.class, id); 
    } 

    @Override 
    @Transactional 
    public void insert(Card card) { 
     getHibernateTemplate().save(card); 
    } 

    @Override 
    @Transactional 
    public void update(Card card) { 
     getHibernateTemplate().saveOrUpdate(card); 
    } 
} 

package net.mitro.model; 

import javax.persistence.*; 

/** 
* Created by mitro on 15/03/2017. 
*/ 

@Entity 
@Table(name = "card") 
public class Card { 

    @Id 
    @GeneratedValue(strategy= GenerationType.AUTO) 
    @Column(name = "id_card") 
    private int idCard; 
    @Column(name = "stamps_num_card") 
    private int stampsNumCard; 
    @ManyToOne 
    @JoinColumn(name = "shop") 
    private Shop shop; 
    @ManyToOne 
    @JoinColumn(name = "user") 
    private User user; 

    public Card(){} 

    public void setStampsNumCard(int stampsNumCard) { 
     this.stampsNumCard = ++stampsNumCard; 
    } 

    public int getIdCard() { 
     return idCard; 
    } 

    public int getStampsNumCard() { 
     return stampsNumCard; 
    } 

    public void setShop(Shop shop) { 
     this.shop = shop; 
    } 

    public void setUser(User user) { 
     this.user = user; 
    } 

    public Shop getShop() { 
     return shop; 
    } 

    public User getUser() { 
     return user; 
    } 
} 

我真的不明白我缺少的也是我POM看起來好像沒什麼問題,因爲我加了春天開機JPA 的pom.xml

... 
<parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.5.2.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-data-jpa</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-hateoas</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-test</artifactId> 
      <scope>test</scope> 
     </dependency> 

     <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> 
     <dependency> 
      <groupId>mysql</groupId> 
      <artifactId>mysql-connector-java</artifactId> 
      <version>6.0.5</version> 
     </dependency> 

    </dependencies> 

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

SO我應該如何實例化這個sessionFactory或hibernateTemplate?我試圖自動裝載它們,但這是不可能的。

+2

幫你一個忙,並使用標準的JPA API而不是舊的,專有的Hibernate API。在使用它的時候,使用spring-data-jpa,它很容易集成到spring-boot中,並且會爲你生成你的DAO。 –

+0

那麼使用JPA比Hibernate更好? – Mitro

+0

JPA只是一個規範,定義了一個標準的API。 Hibernate是這個規範的實現之一。您可以使用Hibernate,但您應該通過標準的JPA API而不是通過舊的專有Hibernate API來使用它。就像你不使用內部的Tomcat API來開發web應用程序一樣。您使用標準的servlet API。 –

回答

1

如果您打算使用Spring Data JPA(因爲您的pom.xml會提示),使用廢棄的HibernateTemplate沒有意義。

當Spring Data JPA正在使用時,Spring Boot不會創建SessionFactory bean,但它會創建EntityManagerFactory。 您可以自動裝入並解包到SessionFactory。你

@Bean 
public SessionFactory sessionFactory(EntityManagerFactory entityManagerFactory) { 
    return entityManagerFactory.unwrap(SessionFactory.class); 
} 

也可結合Sessionorg.springframework.orm.hibernate4.SpringSessionContext

但是,Spring Data JPA存儲庫使用不同的上下文。

我無法創建一個Spring項目,其中HibernateTemplate和Spring Data JPA存儲庫共享Session上下文。

相關問題