org.springframework.beans.factory.BeanCreationException等相关各种异常总结

项目场景:

博主在做CRM实训的时候,这问题可谓是折磨的我彻夜难眠!!!
虽然异常很简单,但是导致的原因太多了。
下面我来做个最全面的总结,博主断断续续搞了3天!!!
这种小BUG让我修这么久,真的很惭愧,起初第一次maven逆向生成文件的时候,因为是挂了VPN导致的BeanCreationException异常,但是这很迷,解决的很离奇,果不其然,第二天再生成其他文件的时候,就给我来大问题了。

重点!!!直接看我这个就行了,包含90%博主所有关于这个问题的解答!!


问题描述:

org.springframework.beans.factory.BeanCreationException:
** 一眼便知Bean注入异常**

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
** springboot没有找到resources文件下的xml文件**


我的项目结构:

tty的CRM系统的项目结构使用MAVEN命令mybatis-generator:generate -e 在resources/mappers下生成xml,vo下生成表属性,Dao下生成与数据库通信的接口。
generatorConfig.xml、POM、application所有配置都放底下,后期整个项目放Github,有疑问直接评论区,看到必回,哪怕不会…


异常1及异常2解决方案:

其实这俩个问题会连带出现,异常BeanCreationException多半呢,就是资源注解没配置好,BindingException的异常就多嘞,迷的很。


重点来了!!!!

异常1:BeanCreationException解决方案:

  1. 启动类里面加个@MapperScan(包名)扫描接口。
  2. IOC扫描的时候直接扫描java文件,如果把配置文件放在java目录下是无法扫描到xml的,可以在Pom中加上
  3. service 层或Controller层未加注解
  4. 查询生成的xml中namespce及相关名称是否和Dao层对应(坦白讲,把该对应的名称全部对一遍,尤其是自己手动写的,自动生成的么查查方法有没有重复的)
  5. 每次修改完配置,IDEA→Build→Rebuild Project,并把target文件删掉,重新运行并生成
  6. 针对个人需要,假如全部都试过了,把VPN关了,并且把网络代理改回来。
  7. 在xml随便哪里按个空格或者回车,保存(试试,不确保生效,原理不知)
  8. Controller层加@Autowired(required =false),Service加@Autowired,Service加了会报错,但是不影响,不会报错的,我这边自己用的Resource,也没问题的,各位开发者根据自己情况参考一下。反正归根结底还是没有找到资源。
  9. 还有@RequestMapping("/")注意斜杠方向,好像如果写了,内容重复的话也会报错的,试过,但是没深究,仅供参考。
  10. mysql的版本和mybatis的sql版本有的开发者需要版本相同,我8.0.21用的8.0.19的Jar包,详细的可以去maven看看导入的mysql版本。

下方分别介绍

假如异常1没报错,也要检查下面内容,再去看异常2,博主和这玩儿对线了3天!!

  • application中的中文注释全部去掉
  • 启动类里面加个@MapperScan(包名)扫描接口。
package com.xxxx.crm;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.scheduling.annotation.EnableScheduling;
/**
     * 
     *
     * @Author 陶天阳
     * @Description //TODO 
     * @Date 2021/1/9 14:50
     * @Param 
     * @return 
     **/

@SpringBootApplication
@MapperScan("com.xxxx.crm.dao")

public class Starter extends SpringBootServletInitializer {
    /* 设置Web项目的启动入口 */
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(com.xxxx.crm.Starter.class);
    }
}


  • IOC扫描的时候直接扫描java文件,如果把配置文件放在java目录下是无法扫描到xml的,
    可以在Pom中加上
<!--      <resources>-->
<!--          <resource>-->
<!--              <directory>src/main/java</directory>-->
<!--              <includes>-->
<!--                  <include>**/*.xml</include>-->
<!--              </includes>-->
<!--          </resource>-->
<!--          <resource>-->
<!--              <directory>src/main/resources</directory>-->
<!--          </resource>-->
<!--      </resources>-->

或者

<build>      
    <resources>          
        <resource>               
            <directory>src/main/java</directory>               
            <includes>                   
                <include>**/*.xml</include>            
            </includes>
        </resource>
    </resources>
</build>
  • service 层或Controller层未加注解
    service层:
    在这里插入图片描述
    Controller层:
    在这里插入图片描述

  • 查询生成的xml中namespce及相关名称是否和Dao层对应(坦白讲,把该对应的名称全部对一遍,尤其是自己手动写的,自动生成的么查查方法有没有重复的)

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.example.dao.SaleChanceMapper">
  <resultMap id="BaseResultMap" type="org.example.vo.SaleChance">
  • 每次修改完配置,IDEA→Build→Rebuild Project,并把target文件删掉,重新运行并生成
  • 针对个人需要,假如全部都试过了,把VPN关了,并且把网络代理改回来。
  • 在xml随便哪里按个空格或者回车,保存(试试,不确保生效,原理不知)
  • Controller层加@Autowired(required =false),Service加@Autowired,Service加了会报错,但是不影响,不会报错的,我这边自己用的Resource,也没问题的,各位开发者根据自己情况参考一下。反正归根结底还是没有找到资源。
  • 还有@RequestMapping("/")注意斜杠方向,好像如果写了,内容重复的话也会报错的,试过,但是没深究,仅供参考。
  • mysql的版本和mybatis的sql版本有的开发者需要版本相同,我8.0.21用的8.0.19的Jar包,详细的可以去maven看看导入的mysql版本。

异常2:BindingException解决方案:

  • 设置Mybatis映射位置

方式一、
在这里插入图片描述
配置Type-aliases-package增加mybatis扫描文件路径

方式二、
在这里插入图片描述
根据自身mybatis版本自行修改,但其实你都测试一下也快的,这里贴图了,方便看,代码我放最底下,自取噢

  • 检查xml和dao方法名是否一样
  • 尤其xml,仔细看,自动生成有时候会有重复内容
  • 版本协同问题,调试版本试试看,springboot2.0之前好像不支持1.8的编译器
  • 如果创建xml文件和dao文件放在一起且xml不在resources层,需要同名,你放在resouces下创建可以不同名,但是你路径和配置得指定好。如果你跟随着网上有的博主,说一定要放在dao下面的话,一直要记住路径不要这么写org.example.dao.mapper,因为编译器是分层解析的,必须写成org/example/dao/mapper。首先为什么一定要放在resources下呢,因为放在main/java下面是不扫描xml的,你放在下面还需要POM新增映射,麻烦! 而且放在resouces下不需要一定放在Dao层下,直接resources下面新建mappersxml放里面就行了。讲了那么多,说实话,怎么放都无所谓,你路径指定好就行。

来来来玄学来了:
上面全测试无果的话下面来试试:

  1. xml里面按空格或者回车保存
  2. 还是要再说一下,遇事情不行,首先maven clean,Project Invalidatecaches,重启就完事了。先重启再来调BUG。
  3. 如果你的pom里面包含mybatis-plus,记得要配置mybatis-plus.mapper-locations,只有mybatis.mapper-locations不起作用(这个巨有用,但是mybatis和mybatis-plus是冲突的别一起配置)
  4. 来个最深层的BUG吧,如果上面方法全不行,大部分可能是Maven的仓库用的同一个,可能仓库内的jar包冲突。去仓库看看吧。

欢迎各位开发者评论区留下你的解决方法,给以后和我一样的新手更全的解决方式!


POM

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="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.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.xxxx</groupId>
  <artifactId>crm</artifactId>
  <version>1.0-SNAPSHOT</version>
  <!-- 设置打包类型为 war包 -->
  <packaging>war</packaging>

  <name>crm</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>


  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.2.RELEASE</version>
  </parent>


  <dependencies>

    <!-- 排除内部Tomcat的影响 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
      <scope>provided</scope>
    </dependency>

    <!-- web 环境 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- aop -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
    <!-- freemarker -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-freemarker</artifactId>
    </dependency>
    <!-- 测试环境 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>

    <!-- mybatis -->
    <dependency>
      <groupId>org.mybatis.spring.boot</groupId>
      <artifactId>mybatis-spring-boot-starter</artifactId>
      <version>2.1.1</version>
    </dependency>

    <!-- 分页插件 -->
    <dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper-spring-boot-starter</artifactId>
      <version>1.2.13</version>
    </dependency>

    <!-- 打包上线时需要忽略配置文件中的mysql -->
    <!-- mysql -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <scope>runtime</scope>
    </dependency>

    <!-- c3p0 -->
    <dependency>
      <groupId>com.mchange</groupId>
      <artifactId>c3p0</artifactId>
      <version>0.9.5.5</version>
    </dependency>

    <!-- commons-lang3 -->
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
      <version>3.5</version>
    </dependency>

    <!-- json -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.47</version>
    </dependency>

    <!-- DevTools 热部署 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-devtools</artifactId>
      <optional>true</optional>
    </dependency>

  </dependencies>

  <build>
    <!-- 设置构建的war文件的名称 -->
    <finalName>crm</finalName>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.3.2</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
          <encoding>UTF-8</encoding>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-maven-plugin</artifactId>
        <version>1.3.2</version>
        <configuration>
          <configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
          <verbose>true</verbose>
          <overwrite>true</overwrite>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
          <!-- 如果没有该配置,热部署的devtools不生效 -->
          <fork>true</fork>
        </configuration>
      </plugin>
    </plugins>
  </build>


</project>

generatorConfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>

    <!--
        数据库驱动
            在左侧project边栏的External Libraries中找到mysql的驱动,右键选择copy path
    -->
    <classPathEntry  location="/Users/ls/Documents/Java/Maven/m2/repository/mysql/mysql-connector-java/8.0.18/mysql-connector-java-8.0.18.jar"/>

    <context id="DB2Tables" targetRuntime="MyBatis3">

        <commentGenerator>
            <!-- 是否去除日期那行注释 -->
            <property name="suppressDate" value="true"/>
            <!-- 是否去除自动生成的注释 true:是 : false:否 -->
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>

        <!-- 数据库链接地址账号密码 -->
        <jdbcConnection
                driverClass="com.mysql.cj.jdbc.Driver"
                connectionURL="jdbc:mysql://127.0.0.1:3306/crm?serverTimezone=GMT%2B8"
                userId="root"
                password="ttytty">
        </jdbcConnection>

        <!--
             java类型处理器
                用于处理DB中的类型到Java中的类型,默认使用JavaTypeResolverDefaultImpl;
                注意一点,默认会先尝试使用Integer,Long,Short等来对应DECIMAL和NUMERIC数据类型;
                true:使用 BigDecimal对应DECIMAL和NUMERIC数据类型
                false:默认,把JDBC DECIMAL和NUMERIC类型解析为Integer
        -->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>



        <!-- 生成Model类存放位置 -->
        <javaModelGenerator targetPackage="com.xxxx.crm.vo" targetProject="src/main/java">
            <!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false -->
            <property name="enableSubPackages" value="true"/>
            <!-- 设置是否在getter方法中,对String类型字段调用trim()方法 -->
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>


        <!--生成映射文件存放位置-->
        <sqlMapGenerator targetPackage="mappers" targetProject="src/main/resources">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>


        <!--生成Dao类存放位置-->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.xxxx.crm.dao" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>



        <table tableName="t_customer_serve" domainObjectName="CustomerServe"
               enableCountByExample="false" enableUpdateByExample="false"
               enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>

    </context>
</generatorConfiguration>


maven命令mybatis-generator:generate -e逆向生成文件
在这里插入图片描述

欢迎各位开发者评论区留下你的解决方法,给以后和我一样的新手更全的解决方式!

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值