Spring4+Hibernate5开发环境搭建过程以及遇到的问题

由于刚刚接触spring框架,所以自己尝试在本地搭建spring+hibernate的整合环境。现将搭建过程整理如下。本文的重点是搭建过程中遇到的问题,希望能够对刚接触这一块知识的同学有所帮助

spring版本号:4.3.10.RELEASE
hibernate版号:5.2.10.Final
JDK版本:1.8
注意:hibernate5不支持jdk1.7,所以如果用低版本的jdk,会导致tomcat无法启动

本文的整体步骤为:
- 引入maven工程
- springmvc配置
- Hibernate配置
- 代码分层
- 问题分析

引入maven工程

首先在eclipse上引入maven工程。这个就不多说了。具体的pom文件中的依赖如下:

<properties>
    
    <plugin.resources.version>3.0.2plugin.resources.version>
    <plugin.compiler.version>3.6.2plugin.compiler.version>
    <junit.version>3.8.1junit.version>
    
    <tomcat.servlet.version>8.0.45tomcat.servlet.version>
    <jstl.verson>1.2.1jstl.verson>
    <taglib.version>1.2taglib.version>
    
    <mysql.version>5.1.42mysql.version>
    <hibernate.version>5.2.10.Finalhibernate.version>
    
    <log4j.version>1.2.17log4j.version>
    
    <springmvc.version>4.3.10.RELEASEspringmvc.version>
    <springorm.version>4.3.10.RELEASEspringorm.version>
    
    <aspectj.version>1.5.4aspectj.version>
     
    <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    <argLine>-Dfile.encoding=UTF-8argLine>
  properties>

  <build>
    <finalName>spring-webfinalName>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.pluginsgroupId>
            <artifactId>maven-resources-pluginartifactId>
            <version>${plugin.resources.version}version>
        plugin>
        <plugin> 
            <groupId>org.apache.maven.pluginsgroupId> 
            <artifactId>maven-compiler-pluginartifactId>
            <version>${plugin.compiler.version}version>
            <configuration> 
                <source>1.8source> 
                <target>1.8target> 
            configuration> 
        plugin>   
    plugins>
    <resources>
        <resource>
        <directory>src/main/resourcesdirectory>
        resource>
        <resource>
        <directory>src/test/resourcesdirectory>
        resource>
  resources>
  build>

  <dependencies>
    <dependency>
      <groupId>junitgroupId>
      <artifactId>junitartifactId>
      <version>${junit.version}version>
      <scope>testscope>
    dependency>
    <dependency>
       <groupId>org.springframeworkgroupId>
       <artifactId>spring-webmvcartifactId>
       <version>${springmvc.version}version>
    dependency>
    <dependency>
        <groupId>org.springframeworkgroupId>
        <artifactId>spring-ormartifactId>
        <version>${springorm.version}version>
    dependency>
    <dependency>
        <groupId>org.hibernategroupId>
        <artifactId>hibernate-coreartifactId>
        <version>${hibernate.version}version>
    dependency>
    <dependency>
        <groupId>mysqlgroupId>
        <artifactId>mysql-connector-javaartifactId>
        <version>${mysql.version}version>
    dependency>

    <dependency>
        <groupId>org.apache.tomcatgroupId>
        <artifactId>tomcat-servlet-apiartifactId>
        <version>${tomcat.servlet.version}version>
        
        <scope>providedscope>
    dependency>
    <dependency>
        <groupId>javax.servlet.jsp.jstlgroupId>
        <artifactId>javax.servlet.jsp.jstl-apiartifactId>
        <version>${jstl.verson}version>
    dependency>
    <dependency>
        <groupId>org.glassfish.webgroupId>
        <artifactId>jstl-implartifactId>
        <version>${taglib.version}version>
    dependency>
    <dependency>
    <groupId>aspectjgroupId>
    <artifactId>aspectjweaverartifactId>
    <version>${aspectj.version}version>
    dependency>
  dependencies>

==注意:maven工程如果缺少src/main/resource等目录,可以手动建立后自行build到classpath==

springmvc配置

首先配置web.xml文件:


<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>spring-webdisplay-name>
  <context-param>
    <param-name>contextConfigLocationparam-name>
    <param-value>classpath:applicationContext.xmlparam-value>
  context-param>
  <listener>
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    listener-class>
  listener>
  
  <servlet>
    <servlet-name>springwebservlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    servlet-class>
    
    <init-param>
        <param-name>contextClassparam-name>
        <param-value>
            org.springframework.web.context.support.AnnotationConfigWebApplicationContext
        param-value>
    init-param>
    
    <init-param>
        <param-name>contextConfigLocationparam-name>
        <param-value>
            com.xuxinyu.web.config.WebConfig
        param-value>
    init-param>
    <load-on-startup>1load-on-startup>
  servlet>
  
  <servlet-mapping>
    <servlet-name>springwebservlet-name>
    <url-pattern>/url-pattern>
  servlet-mapping>
  
  <filter>
        <filter-name>characterEncodingFilterfilter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
        <init-param>
            <param-name>encodingparam-name>
            <param-value>UTF-8param-value>
        init-param>
        <init-param>
            <param-name>forceEncodingparam-name>
            <param-value>trueparam-value>
        init-param>
    filter>
    <filter-mapping>
        <filter-name>characterEncodingFilterfilter-name>
        <url-pattern>/*url-pattern>
    filter-mapping>
web-app>

说明:
此处配置了两个Context。
1. ContextLoaderListener将加载applicationContext.xml,会建立应用上下文
2. DispatcherServlet,创建springmvc应用上下文
第一个应用上下文主要加载DOM层或者Service层的Bean组件
第二个应用上下文主要加载包含Web组件的bean比如Controller、ViewMode等

==此处,我的springmvc配置没有使用spring-servlet.xml方式配置,而是指定了注解方式的配置方法==

springmvc注解方式的代码如下,代码解释写在了注释里了:


@Configuration
@EnableWebMvc
@ComponentScan(basePackages={"com.xuxinyu.web.controller"})
public class WebConfig extends WebMvcConfigurerAdapter {


    /*配置视图解析器
     * 将在/WEB-INF/views下解析jsp视图
     * */
    @Bean
    public ViewResolver viewResolver(){
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        resolver.setExposeContextBeansAsAttributes(true);
        return resolver;
    }

    /*配置静态资源的处理,要求DispatcherServlet将静态资源(CSS/HTML等)的请求转发到tomcat默认的servlet上进行处理*/
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer){
        configurer.enable();
    }

    @Override
      public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // TODO Auto-generated method stub
        super.addResourceHandlers(registry);
    }
}

主要的作用是:
- 启动自动扫描bean功能,扫描范围:com.xuxinyu.web.controller包下的所有带有@Complement、@Controller等定义了bean注解的类
- 启动MVC功能

Hibernate配置

首先配置spring-hibernate.xml文件
可能你会奇怪为什么不先配置applicationContext.xml。是因为主要配置都在spring-hibernate.xml中applicationContext.xml仅仅是对其他配置文件的引用。

spring-hibernate.xml


<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="         
          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
          http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
          http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.3.xsd
          http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
          http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd"
    default-autowire="byName">

      
    <bean id="dataSource"  
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />  
        <property name="url" value="jdbc:mysql://192.168.199.110:3306/test?characterEncoding=UTF-8" />  
        <property name="username" value="root" />  
        <property name="password" value="root" />  
    bean>

      
    <bean id="sessionFactory"  
        class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">  
        <property name="dataSource" ref="dataSource" />  
        <property name="hibernateProperties">  
            <props>  
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialectprop>  
                <prop key="hibernate.hbm2ddl.auto">updateprop>  
                <prop key="hibernate.show_sql">trueprop>  
                <prop key="hiberante.format_sql">trueprop>

            props>  
        property>
        
        <property name="annotatedClasses">  
            <list>  
                <value>  
                    com.xuxinyu.web.bean.City
                value>  
            list>  
        property>  
    bean>

       
   <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">  
       <property name="sessionFactory" ref="sessionFactory">property>  
   bean>
   <tx:annotation-driven transaction-manager="transactionManager"/>

     
   <tx:advice id="txAdvice" transaction-manager="transactionManager">  
       <tx:attributes>  
            <tx:method name="find*" propagation="REQUIRED" /> 
            <tx:method name="add*" propagation="REQUIRED" /> 
            <tx:method name="delete*" propagation="REQUIRED" /> 
            <tx:method name="update*" propagation="REQUIRED" /> 
       tx:attributes>  
   tx:advice>

     
   <aop:config>  
      <aop:pointcut expression="execution(* com.xuxinyu.web.dao.DaoImpl.*(..))" id="txPointcut"/>  
      <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>  
   aop:config>

beans>  

接着是:applicationContext.xml


<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="         
          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
          http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
          http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.3.xsd
          http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
          http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd"
    default-autowire="byName">
    
    <import resource="classpath:config/spring-hibernate.xml"/>
    <context:component-scan base-package="com.xuxinyu.web.dao">context:component-scan>
beans>

注意点:
1. applicationContext.xml文件中,配置了对com.xuxinyu.web.dao的自动扫描,这个包主要是存放DAO层的操作。
2. 从引入spring-hibernate.xml文件的路径可以看出,首先,除了web.xml以外,所有的配置文件都是放在src/main/resources下面的,而不是在WEB-INF下,这也符合maven工程的构建习惯。所以如果你仔细看的话,在web.xml中,必须要指定applicationContext.xml的位置
3. 配置 Spring 的声明式事务,需要保证

代码分层

DAO层接口和实现

注意:(因为仅仅是写了个DEMO,所以,没有写Service层,Dao定义好Hibernate的实现后,直接在Contraller中进行了调用)

DAO层

//DAO层接口
package com.xuxinyu.web.interfaces;

import java.util.List;

import com.xuxinyu.web.bean.City;

public interface ICityDao {

    public List findcities(String hql);//查询所有对象

    public City findcity(Class clazz,int id);//根据id查询city

    public void deletemore(List objectlist);//批量删除city

    public void updatecity(City city);//更新一个城市

    public void addcity(City city);//删除一个城市

}
//DAO层实现,并且spring会在这个类中自动引入事务
@Repository
public class DaoImpl implements ICityDao {

    @Resource(name = "sessionFactory")
    private SessionFactory sessionFactory;

    protected Session getCurrentSession() {
        return sessionFactory.getCurrentSession();
    } 

    @SuppressWarnings("unchecked")
    @Override
    public List findcities(String hql) {
        return getCurrentSession().createQuery(hql).list();
    }

    @Override
    public City findcity(Class clazz, int id) {

        return getCurrentSession().get(clazz, id);
    }

    @Override
    public void deletemore(List citylist) {

        for(City city:citylist){
            getCurrentSession().delete(city);
        }
    }

    @Override
    public void updatecity(City city) {
        getCurrentSession().update(city);
    }

    @Override
    public void addcity(City city) {
        getCurrentSession().persist(city);

    }

}

Controller层

/**
1、在构造函数上注入Dao层bean
2、在citylist方法中完成业务操作,本例是对city实体进行全量查询,映射数据库中的city表
3、查询完成后,将结果放入List中,并由spring的Model统一返回到视图层
4、视图层对应的名称为:cities.jsp
**/
@Controller
@RequestMapping({"/citylist"})
public class CityListController {

    private ICityDao icitydao;

    @Autowired
    public CityListController(ICityDao icitydao){
        this.icitydao = icitydao;
    }

    @RequestMapping(method=RequestMethod.GET)
    public String citylist(Model model){

        List citylist = icitydao.findcities("from City");

        model.addAttribute("cityList", citylist);

        return "cities";

    }

}

视图层

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title heretitle>
<style type="text/css">
body, td, th, input {font-size:12px; text-align:center; }style>
<script>
    function fullcheck(){
        var arrcheck=document.getElementsByName('id');
        for(var i=0;itrue;}
    }

    function fulluncheck(){
        var arrcheck=document.getElementsByName('id');
        for(var i=0;ifalse;}
    }
script>
head>

<body>
    <table align="right">
        <tr>
            <td>
            
            <a href="HiberAddCity.jsp">新建城市信息a>
            td>
        tr>
    table>
    <br/>
    <form action="HiberOperateCity.jsp" method="get">

    <table bgcolor='#CCCCCC' cellspacing=1 cellpadding=5 width=100%>
        <tr bgcolor='#DDDDDD'>
            <th>th>
            <th>IDth>
            <th>城市编码th>
            <th>城市名称th>
            <th>省份编码th>
        tr>

        <c:forEach var="city" items="${cityList}">
        <tr bgcolor='#FFFFFF'>
            <td><input type='checkbox' name='id' value="${city.id }">input>td>
            <td><c:out value="${city.id }"/>td>
            <td><c:out value="${city.city_code }"/>td>
            <td><c:out value="${city.city_name }"/>td>
            <td><c:out value="${city.province_name }"/>td>
            <td>
                <a href='HiberOperateCity.jsp?action=del&id="${city.id }"' onclick='return confirm("确定删除该记录?")'>删除a> 
                <a href='HiberOperateCity.jsp?action=edit&id="${city.id }"'>修改a>
            td>
        tr>

        c:forEach>

    table>

    <table align="left">
    <tr>
        <td>
        
        <input type='hidden' value='del' name='action'>
        <a href="#" onclick="fullcheck()">全选a>
        <a href="#" onclick="fulluncheck()">全不选a>
        
        <input type="submit" value="删除" onclick="return confirm('即将删除所选择的记录。是否删除?'); ">
        td>
    tr>
    table>
    form>
body>
html>

具体jsp的就不解释了。

问题分析

在搭建整个工程过程中,因为初次上手,所以踩了不少的坑,在这里一并写下来,算作记录把。也能够给大家提供一些参考

我把搭建环境时遇到的问题列一下,主要问题是tomcat启动不了:

tomcat本地部署完成后,启动失败

1、

八月 26, 2017 4:03:25 下午 org.springframework.web.context.ContextLoader initWebApplicationContext
严重: Context initialization failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'cityListController' defined in file [E:\workspace\jars\apache-tomcat-8.0.45\webapps\spring-web\WEB-INF\classes\com\xuxinyu\web\controller\CityListController.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'daoImpl' defined in file [E:\workspace\jars\apache-tomcat-8.0.45\webapps\spring-web\WEB-INF\classes\com\xuxinyu\web\dao\DaoImpl.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.hibernate.SessionFactory' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749)
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:189)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1193)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1095)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:443)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:325)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4853)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5314)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:753)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:729)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1129)
    at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1871)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'daoImpl' defined in file [E:\workspace\jars\apache-tomcat-8.0.45\webapps\spring-web\WEB-INF\classes\com\xuxinyu\web\dao\DaoImpl.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.hibernate.SessionFactory' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749)
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:189)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1193)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1095)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
    at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:208)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1138)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:835)
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741)
    ... 28 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.hibernate.SessionFactory' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1493)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1104)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:835)
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741)
    ... 42 more

我遇到这问题是因为web.xml里的配置错误,报错信息

No qualifying bean of type ‘org.hibernate.SessionFactory’ available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}

说明上下文生成SessionFactory的bean时根本没有找到对应的任何注解或者xml配置信息

因为根本就没有找到applicationContext所在位置

2、
设置好web.xml后。再次启动,依然报错如下:

严重: Context initialization failed
org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from ServletContext resource [/WEB-INF/applicationContext.xml]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/applicationContext.xml]
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:344)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:181)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:217)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:188)
    at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:125)
    at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:94)
    at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:129)
    at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:614)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:515)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:443)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:325)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4853)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5314)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:753)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:729)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1129)
    at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1871)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/applicationContext.xml]
    at org.springframework.web.context.support.ServletContextResource.getInputStream(ServletContextResource.java:141)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:330)
    ... 25 more
八月 26, 2017 4:53:52 下午 org.apache.catalina.core.StandardContext listenerStart

这个问题很简单,提示无法打开applicationContext.xml
但是我看了下web.xml明明已经指定了applicationContext.xml
当时的配置是这样的:

<listener>
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    listener-class>
  listener>
<context-param>
    <param-name>contextConfigLocationparam-name>
    <param-value>classpath:applicationContext.xmlparam-value>
  context-param>

没有想清楚问题原因,只好请教google君,发现是配置项的顺序问题,需要先将放在最前面进行加载才能启用spring的监听器。后将web.xml改动如下:

 <context-param>
    <param-name>contextConfigLocationparam-name>
    <param-value>classpath:applicationContext.xmlparam-value>
  context-param>
  <listener>
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    listener-class>
  listener>

问题解决

3、再次启动tomcat,依然报错如下:

严重: Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [config/spring-hibernate.xml]: BeanPostProcessor before instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.aop.support.DefaultBeanFactoryPointcutAdvisor#0': Cannot resolve reference to bean 'txPointcut' while setting bean property 'pointcut'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'txPointcut': Failed to introspect bean class [org.springframework.aop.aspectj.AspectJExpressionPointcut] for lookup method metadata: could not find class that it depends on; nested exception is java.lang.NoClassDefFoundError: org/aspectj/weaver/reflect/ReflectionWorld$ReflectionWorldException
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:479)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:443)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:325)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4853)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5314)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:753)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:729)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1129)
    at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1871)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.aop.support.DefaultBeanFactoryPointcutAdvisor#0': Cannot resolve reference to bean 'txPointcut' while setting bean property 'pointcut'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'txPointcut': Failed to introspect bean class [org.springframework.aop.aspectj.AspectJExpressionPointcut] for lookup method metadata: could not find class that it depends on; nested exception is java.lang.NoClassDefFoundError: org/aspectj/weaver/reflect/ReflectionWorld$ReflectionWorldException
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:359)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1531)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1276)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
    at org.springframework.aop.framework.autoproxy.BeanFactoryAdvisorRetrievalHelper.findAdvisorBeans(BeanFactoryAdvisorRetrievalHelper.java:92)
    at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findCandidateAdvisors(AbstractAdvisorAutoProxyCreator.java:102)
    at org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator.shouldSkip(AspectJAwareAdvisorAutoProxyCreator.java:103)
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessBeforeInstantiation(AbstractAutoProxyCreator.java:248)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInstantiation(AbstractAutowireCapableBeanFactory.java:1037)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.resolveBeforeInstantiation(AbstractAutowireCapableBeanFactory.java:1011)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:473)
    ... 23 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'txPointcut': Failed to introspect bean class [org.springframework.aop.aspectj.AspectJExpressionPointcut] for lookup method metadata: could not find class that it depends on; nested exception is java.lang.NoClassDefFoundError: org/aspectj/weaver/reflect/ReflectionWorld$ReflectionWorldException
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:269)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineConstructorsFromBeanPostProcessors(AbstractAutowireCapableBeanFactory.java:1118)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1091)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:325)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:351)
    ... 39 more
Caused by: java.lang.NoClassDefFoundError: org/aspectj/weaver/reflect/ReflectionWorld$ReflectionWorldException
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
    at java.lang.Class.getDeclaredMethods(Class.java:1975)
    at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtil
s.java:613)
    at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:524)
    at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:510)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:247)
    ... 46 more
Caused by: java.lang.ClassNotFoundException: org.aspectj.weaver.reflect.ReflectionWorld$ReflectionWorldException
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1333)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1167)
    ... 53 more
八月 26, 2017 5:04:47 下午 org.apache.catalina.core.StandardContext listenerStart

这个报错信息写的很清楚:
java.lang.NoClassDefFoundError: org/aspectj/weaver/

是因为在事务管理配置处使用了aop切面,需要引入Aspject的aspectjweaver包

4、再次启动tomcat,又是报错,当时已处于崩溃边缘


严重: Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'daoImpl' defined in file [E:\workspace\jars\apache-tomcat-8.0.45\webapps\spring-web\WEB-INF\classes\com\xuxinyu\web\dao\DaoImpl.class]: Bean instantiation via constructor failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.xuxinyu.web.dao.DaoImpl]: Constructor threw exception; nested exception is org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:279)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1193)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1095)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:443)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:325)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4853)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5314)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:753)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:729)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1129)
    at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1871)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.xuxinyu.web.dao.DaoImpl]: Constructor threw exception; nested exception is org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:154)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:122)
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:271)
    ... 27 more
Caused by: org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
    at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:134)
    at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:456)
    at com.xuxinyu.web.dao.DaoImpl.(DaoImpl.java:22)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:142)
    ... 29 more
八月 26, 2017 5:23:53 下午 org.apache.catalina.core.StandardContext listenerStart

这个问题很坑,网上有很多方法,全都被我试了一遍,但是都没有解决问题。
折腾了一下午都没搞定。相当崩溃。
后来仔细的看了下报错信息,提示DaoImpl的Constructor threw exception,也就是构造函数有问题。
仔细看了下代码,报错时候是这么写的:

private Session session;
@Autowired
public DaoImpl(SessionFactory sessionFactory){
    this.session = sessionFactory.getCurrentSession()
}

改成如下写法,

@Autowired
    private SessionFactory sessionFactory;

    protected Session getCurrentSession() {
        return sessionFactory.getCurrentSession();
    } 

启动tomcat成功了

你可能感兴趣的:(java-web,springmvc)