欢迎来到DIVCSS5查找CSS资料与学习DIV CSS布局技术!
  javaweb各种框架组合案例(四):maven+spring+springMVC+springdatajpa(hibernate)【失败案例】
 
  一、失败案例
 
  1.控制台报错信息
 
  严重:Exceptionsendingcontextinitializedeventtolistenerinstanceofclassorg.springframework.web.context.ContextLoaderListener
 
  org.springframework.beans.factory.UnsatisfiedDependencyException:Errorcreatingbeanwithname'userServiceImpl':Unsatisfieddependencyexpressedthroughfield'userDao';nestedexceptionisorg.springframework.beans.factory.BeanCreationException:Errorcreatingbeanwithname'userDao':Invocationofinitmethodfailed;nestedexceptionisjava.util.NoSuchElementException
 
  atorg.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:588)
 
  atorg.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
 
  atorg.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366)
 
  atorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264)
 
  atorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
 
  atorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
 
  atorg.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
 
  atorg.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
 
  atorg.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
 
  atorg.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
 
  atorg.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)
 
  atorg.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)
 
  atorg.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)
 
  atorg.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:443)
 
  atorg.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:325)
 
  atorg.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
 
  atorg.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4797)
 
  atorg.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5291)
 
  atorg.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
 
  atorg.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
 
  atorg.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
 
  atjava.util.concurrent.FutureTask.run(FutureTask.java:266)
 
  atjava.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
 
  atjava.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
 
  atjava.lang.Thread.run(Thread.java:748)
 
  2.初步判断
 
  springdatajpa无法自动实现dao层接口
 
  3.原因
 
  未知,非扫描包问题
 
  二、项目
 
  1.项目整体包结构
 
  2.业务
 
  实现一个用户具有多部手机的业务
 
  3.各配置文件
 
  (1)pom.xml
 
  <projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd">
 
  <modelVersion>4.0.0</modelVersion>
 
  <groupId>com.xiaog</groupId>
 
  <artifactId>testssdj</artifactId>
 
  <version>0.0.1-SNAPSHOT</version>
 
  <packaging>war</packaging>
 
  <dependencies>
 
  <!--spring+springmvc顶级依赖包,包含spring-webmvc、spring-aop、spring-beans、
 
  spring-context、spring-core、spring-jcl、spring-expression、spring-web-->
 
  <dependency>
 
  <groupId>org.springframework</groupId>
 
  <artifactId>spring-webmvc</artifactId>
 
  <version>4.3.10.RELEASE</version>
 
  </dependency>
 
  <!--spring-aop所依赖的静态代理,
 
  使用aop方式管理事务,在service方法执行前开启事务,
 
  方法执行后提交事务,方法执行失败回滚事务-->
 
  <dependency>
 
  <groupId>org.aspectj</groupId>
 
  <artifactId>aspectjrt</artifactId>
 
  <version>1.8.0</version>
 
  </dependency>
 
  <dependency>
 
  <groupId>org.aspectj</groupId>
 
  <artifactId>aspectjweaver</artifactId>
 
  <version>1.8.0</version>
 
  </dependency>
 
  <!--数据库方面-->
 
  <dependency>
 
  <groupId>mysql</groupId>
 
  <artifactId>mysql-connector-java</artifactId>
 
  <version>5.1.47</version>
 
  </dependency>
 
  <dependency>
 
  <groupId>com.alibaba</groupId>
 
  <artifactId>druid</artifactId>
 
  <version>1.1.10</version>
 
  </dependency>
 
  <!--orm框架-->
 
  <dependency>
 
  <groupId>org.hibernate</groupId>
 
  <artifactId>hibernate-core</artifactId>
 
  <version>4.2.2.Final</version>
 
  </dependency>
 
  <dependency>
 
  <groupId>org.hibernate</groupId>
 
  <artifactId>hibernate-entitymanager</artifactId>
 
  <version>4.2.2.Final</version>
 
  </dependency>
 
  <!--springdatajpa-->
 
  <dependency>
 
  <groupId>org.springframework.data</groupId>
 
  <artifactId>spring-data-jpa</artifactId>
 
  <version>1.11.3.RELEASE</version>
 
  </dependency>
 
  <dependency>
 
  <groupId>org.slf4j</groupId>
 
  <artifactId>slf4j-api</artifactId>
 
  <version>1.7.25</version>
 
  </dependency>
 
  <dependency>
 
  <groupId>org.slf4j</groupId>
 
  <artifactId>slf4j-log4j12</artifactId>
 
  <version>1.7.25</version>
 
  </dependency>
 
  <!--Logback-->
 
  <!--<dependency>
 
  <groupId>ch.qos.logback</groupId>
 
  <artifactId>logback-classic</artifactId>
 
  <version>0.9.19</version>
 
  </dependency>
 
  <dependency>
 
  <groupId>org.logback-extensions</groupId>
 
  <artifactId>logback-ext-spring</artifactId>
 
  <version>0.1.2</version>
 
  </dependency>
 
  <dependency>
 
  <groupId>org.slf4j</groupId>
 
  <artifactId>jcl-over-slf4j</artifactId>
 
  <version>1.6.6</version>
 
  </dependency>-->
 
  <!--jsp需要-->
 
  <dependency>
 
  <groupId>javax.servlet</groupId>
 
  <artifactId>servlet-api</artifactId>
 
  <version>3.0-alpha-1</version>
 
  <scope>provided</scope>
 
  </dependency>
 
  <dependency>
 
  <groupId>jstl</groupId>
 
  <artifactId>jstl</artifactId>
 
  <version>1.1.2</version>
 
  </dependency>
 
  </dependencies>
 
  <build>
 
  <defaultGoal>compile</defaultGoal>
 
  <plugins>
 
  <!--maven插件-->
 
  <plugin>
 
  <groupId>org.apache.maven.plugins</groupId>
 
  <artifactId>maven-compiler-plugin</artifactId>
 
  <version>3.1</version>
 
  <configuration>
 
  <source>1.8</source>
 
  <target>1.8</target>
 
  <encoding>UTF-8</encoding>
 
  </configuration>
 
  </plugin>
 
  <!--tomcat插件-->
 
  <plugin>
 
  <groupId>org.apache.tomcat.maven</groupId>
 
  <artifactId>tomcat7-maven-plugin</artifactId>
 
  <version>2.1</version>
 
  <configuration>
 
  <port>9999</port>
 
  <path>/testssdj</path>
 
  <uriEncoding>UTF-8</uriEncoding>
 
  <finalName>testssdj</finalName>
 
  <server>tomcat7</server>
 
  </configuration>
 
  </plugin>
 
  </plugins>
 
  </build>
 
  </project>
 
  (2)spring-context.xml
 
  <?xmlversion="1.0"encoding="UTF-8"?>
 
  <beansxmlns="http://www.springframework.org/schema/beans"
 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 
  xmlns:tx="http://www.springframework.org/schema/tx"
 
  xmlns:context="http://www.springframework.org/schema/context"
 
  xmlns:jpa="http://www.springframework.org/schema/data/jpa"
 
  xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd
 
  http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsd
 
  http://www.springframework.org/schema/context
 
  http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/data/jpahttp://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
 
  <!--指定连接池配置-->
 
  <!--dao层数据库连接部分-->
 
  <!--加载配置文件-->
 
  <context:property-placeholder
 
  location="classpath:jdbc.properties"/>
 
  <!--配置service扫描-->
 
  <context:component-scan
 
  base-package="com.xiaog.service"/>
 
  <!--数据库连接池-->
 
  <beanid="dataSource"
 
  class="com.alibaba.druid.pool.DruidDataSource"destroy-method="close">
 
  <propertyname="driverClassName"value="${jdbc.driver}"/>
 
  <propertyname="url"value="${jdbc.url}"/>
 
  <propertyname="username"value="${jdbc.username}"/>
 
  <propertyname="password"value="${jdbc.password}"/>
 
  <!--连接池的最大数据库连接数-->
 
  <propertyname="maxActive"value="10"/>
 
  <!--最大空闲数-->
 
  <propertyname="maxIdle"value="5"/>
 
  </bean>
 
  <!--spring整合JPA-->
 
  <beanid="entityManagerFactory"class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
 
  <propertyname="dataSource"ref="dataSource"/>
 
  <propertyname="jpaVendorAdapter">
 
  <beanclass="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"></bean>
 
  </property>
 
  <!--配置包扫描,扫描实体-->
 
  <propertyname="packagesToScan"value="com.xiaog.entity"/>
 
  <propertyname="jpaProperties">
 
  <props>
 
  <!--生成的数据表的列的映射策略-->
 
  <propkey="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>
 
  <!--hibernate基本属性-->
 
  <propkey="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
 
  <propkey="hibernate.show_sql">true</prop>
 
  <propkey="hibernate.format_sql">true</prop>
 
  <propkey="hibernate.hbm2ddl.auto">update</prop>
 
  </props>
 
  </property>
 
  </bean>
 
  <!--配置事务管理器-->
 
  <beanid="transactionManager"class="org.springframework.orm.jpa.JpaTransactionManager">
 
  <propertyname="entityManagerFactory"ref="entityManagerFactory"/>
 
  </bean>
 
  <!--开启事务注解-->
 
  <tx:annotation-driventransaction-manager="transactionManager"/>
 
  <!--指定SpringDataJPA要进行扫描的包,该包中的类框架会自动为其创建代理-->
 
  <jpa:repositoriesbase-package="com.xiaog.dao"entity-manager-factory-ref="entityManagerFactory"></jpa:repositories>
 
  </beans>
 
  (3)spring-mvc.xml
 
  <?xmlversion="1.0"encoding="UTF-8"?>
 
  <beansxmlns="http://www.springframework.org/schema/beans"
 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 
  xmlns:context="http://www.springframework.org/schema/context"
 
  xmlns:mvc="http://www.springframework.org/schema/mvc"
 
  xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.0.xsd
 
  http://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
 
  http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.0.xsd">
 
  <!--配置controller扫描-->
 
  <context:component-scanbase-package="com.xiaog.controller"/>
 
  <!--注解驱动-->
 
  <mvc:annotation-driven/>
 
  <!--视图解析器-->
 
  <beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver">
 
  <propertyname="prefix"value="/"/>
 
  <propertyname="suffix"value=".jsp"/>
 
  </bean>
 
  </beans>
 
  (4)jdbc.properties
 
  jdbc.driver=com.mysql.jdbc.Driver
 
  jdbc.url=jdbc:mysql://localhost:3306/ssdj?useSSL=false&amp;useUnicode=true&amp;characterEncoding=utf8
 
  jdbc.username=root
 
  jdbc.password=root
 
  (5)web.xml
 
  <?xmlversion="1.0"encoding="UTF-8"?>
 
  <web-appxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 
  xmlns="http://java.sun.com/xml/ns/javaee"
 
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
 
  version="3.0">
 
  <display-name>testssdj</display-name>
 
  <!--spring配置文件路径-->
 
  <context-param>
 
  <param-name>contextConfigLocation</param-name>
 
  <param-value>classpath:spring-context.xml</param-value>
 
  </context-param>
 
  <listener>
 
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 
  </listener>
 
  <!--解决post乱码问题-->
 
  <filter>
 
  <filter-name>encoding</filter-name>
 
  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
 
  <!--设置编码参是UTF8-->
 
  <init-param>
 
  <param-name>encoding</param-name>
 
  <param-value>UTF-8</param-value>
 
  </init-param>
 
  </filter>
 
  <filter-mapping>
 
  <filter-name>encoding</filter-name>
 
  <url-pattern>/*</url-pattern>
 
  </filter-mapping>
 
  <!--配置SpringMvc前端控制器-->
 
  <servlet>
 
  <servlet-name>spring-mvc</servlet-name>
 
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 
  <!--指定SpringMvc配置文件-->
 
  <init-param>
 
  <param-name>contextConfigLocation</param-name>
 
  <param-value>classpath:spring-mvc.xml</param-value>
 
  </init-param>
 
  </servlet>
 
  <servlet-mapping>
 
  <servlet-name>spring-mvc</servlet-name>
 
  <url-pattern>/</url-pattern>
 
  </servlet-mapping>
 
  <!--添加日志监听器-->
 
  <!--<context-param>
 
  <param-name>logbackConfigLocation</param-name>
 
  <param-value>classpath:logback.xml</param-value>
 
  </context-param>
 
  <listener>
 
  <listener-class>ch.qos.logback.ext.spring.web.LogbackConfigListener</listener-class>
 
  </listener>-->
 
  <welcome-file-list>
 
  <welcome-file>index.jsp</welcome-file>
 
  </welcome-file-list>
 
  </web-app>
 
  4.实体层
 
  packagecom.xiaog.entity;
 
  importjavax.persistence.Entity;
 
  importjavax.persistence.GeneratedValue;
 
  importjavax.persistence.GenerationType;
 
  importjavax.persistence.Id;
 
  importjavax.persistence.Table;
 
  @Entity
 
  @Table(name="phone")
 
  publicclassPhone{
 
  @Id
 
  @GeneratedValue(strategy=GenerationType.IDENTITY)
 
  privateIntegerid;
 
  privateStringbrand;//品牌
 
  publicIntegergetId(){
 
  returnid;
 
  }
 
  publicvoidsetId(Integerid){
 
  this.id=id;
 
  }
 
  publicStringgetBrand(){
 
  returnbrand;
 
  }
 
  publicvoidsetBrand(Stringbrand){
 
  this.brand=brand;
 
  }
 
  @Override
 
  publicStringtoString(){
 
  return"Phone[id="+id+",brand="+brand+"]";
 
  }
 
  }
 
  packagecom.xiaog.entity;
 
  importjava.util.List;
 
  importjavax.persistence.Entity;
 
  importjavax.persistence.GeneratedValue;
 
  importjavax.persistence.GenerationType;
 
  importjavax.persistence.Id;
 
  importjavax.persistence.JoinColumn;
 
  importjavax.persistence.OneToMany;
 
  importjavax.persistence.Table;
 
  @Entity
 
  @Table(name="user")
 
  publicclassUser{
 
  @Id
 
  @GeneratedValue(strategy=GenerationType.IDENTITY)
 
  privateIntegerid;
 
  privateStringusername;
 
  privateStringpassword;
 
  @OneToMany(targetEntity=Phone.class)
 
  @JoinColumn(name="user_id")
 
  privateList<Phone>phones;//一个用户拥有多部手机
 
  publicIntegergetId(){
 
  returnid;
 
  }
 
  publicvoidsetId(Integerid){
 
  this.id=id;
 
  }
 
  publicStringgetUsername(){
 
  returnusername;
 
  }
 
  publicvoidsetUsername(Stringusername){
 
  this.username=username;
 
  }
 
  publicStringgetPassword(){
 
  returnpassword;
 
  }
 
  publicvoidsetPassword(Stringpassword){
 
  this.password=password;
 
  }
 
  publicList<Phone>getPhones(){
 
  returnphones;
 
  }
 
  publicvoidsetPhones(List<Phone>phones){
 
  this.phones=phones;
 
  }
 
  @Override
 
  publicStringtoString(){
 
  return"User[id="+id+",username="+username+",password="+password+",phones="+phones+"]";
 
  }
 
  }
 
  5.dao层
 
  packagecom.xiaog.dao;
 
  importorg.springframework.data.jpa.repository.JpaRepository;
 
  importorg.springframework.stereotype.Repository;
 
  importcom.xiaog.entity.Phone;
 
  @Repository
 
  publicinterfacePhoneDaoextendsJpaRepository<Phone,Integer>{
 
  }
 
  packagecom.xiaog.dao;
 
  importorg.springframework.data.jpa.repository.JpaRepository;
 
  importorg.springframework.stereotype.Repository;
 
  importcom.xiaog.entity.User;
 
  @Repository
 
  publicinterfaceUserDaoextendsJpaRepository<User,Integer>{
 
  UserfindByUsernameAndPassword(Useruser);
 
  }
 
  6.service层
 
  packagecom.xiaog.service;
 
  importcom.xiaog.entity.User;
 
  publicinterfaceUserService{
 
  Userlogin(Useruser);
 
  }
 
  packagecom.xiaog.service.impl;
 
  importorg.slf4j.Logger;
 
  importorg.slf4j.LoggerFactory;
 
  importorg.springframework.beans.factory.annotation.Autowired;
 
  importorg.springframework.stereotype.Service;
 
  importorg.springframework.transaction.annotation.Transactional;
 
  importcom.xiaog.dao.UserDao;
 
  importcom.xiaog.entity.User;
 
  importcom.xiaog.service.UserService;
 
  @Service
 
  @Transactional
 
  publicclassUserServiceImplimplementsUserService{
 
  @Autowired
 
  privateUserDaouserDao;
 
  privatefinalstaticLoggerlogger=LoggerFactory.getLogger(UserServiceImpl.class);
 
  @Override
 
  publicUserlogin(Useruser){
 
  //logger.info("进入UserServiceImpl......");
 
  user=userDao.findByUsernameAndPassword(user);
 
  logger.info("user="+user);
 
  returnuser;
 
  }
 
  }
 
  7.controller层
 
  packagecom.xiaog.controller;
 
  importorg.slf4j.Logger;
 
  importorg.slf4j.LoggerFactory;
 
  importorg.springframework.beans.factory.annotation.Autowired;
 
  importorg.springframework.stereotype.Controller;
 
  importorg.springframework.ui.Model;
 
  importorg.springframework.web.bind.annotation.RequestMapping;
 
  importcom.xiaog.entity.User;
 
  importcom.xiaog.service.UserService;
 
  @Controller
 
  @RequestMapping("/user")
 
  publicclassUserController{
 
  @Autowired(required=false)
 
  privateUserServiceuserService;
 
  privatefinalstaticLoggerlogger=LoggerFactory.getLogger(UserController.class);
 
  @RequestMapping(value="/login",params={"username","password","username!=","password!="})
 
  publicStringlogin(Modelmodel,Useruser){
 
  logger.info("user(request)="+user);
 
  user=userService.login(user);
 
  logger.info("user="+user);
 
  model.addAttribute("user",user);
 
  return"result";
 
  }
 
  }
 
  8.jsp页面
 
  <%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%>
 
  <!doctypehtml>
 
  <html>
 
  <head>
 
  <metacharset="UTF-8">
 
  <title>Inserttitlehere</title>
 
  </head>
 
  <body>
 
  <formaction="user/login"method="post">
 
  <div>
 
  <label>username</label>
 
  <inputtype="text"name="username"/>
 
  </div>
 
  <div>
 
  <label>password</label>
 
  <inputtype="password"name="password"/>
 
  </div>
 
  <div>
 
  <inputtype="submit"value="登录">
 
  </div>
 
  </form>
 
  </body>
 
  </html>
 
  index.jsp
 
  <%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%>
 
  <!doctypehtml>
 
  <html>
 
  <head>
 
  <metacharset="UTF-8">
 
  <title></title>
 
  </head>
 
  <body>
 
  username=${user}
 
  </body>
 
  </html>
 
  result.jsp
 
  三、求解决
 
  若有大神能够解决问题,在下感激不尽

如需转载,请注明文章出处和来源网址:http://www.divcss5.com/html/h56895.shtml