项目场景:
博主在做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文件**
我的项目结构:
使用MAVEN命令mybatis-generator:generate -e 在resources/mappers下生成xml,vo下生成表属性,Dao下生成与数据库通信的接口。
generatorConfig.xml、POM、application所有配置都放底下,后期整个项目放Github,有疑问直接评论区,看到必回,哪怕不会…
异常1及异常2解决方案:
其实这俩个问题会连带出现,异常BeanCreationException多半呢,就是资源注解没配置好,BindingException的异常就多嘞,迷的很。
重点来了!!!!
异常1:BeanCreationException解决方案:
- 启动类里面加个
@MapperScan(包名)
扫描接口。 - IOC扫描的时候直接扫描java文件,如果把配置文件放在java目录下是无法扫描到xml的,可以在Pom中加上
- service 层或Controller层未加注解
- 查询生成的xml中namespce及相关名称是否和Dao层对应(坦白讲,把该对应的名称全部对一遍,尤其是自己手动写的,自动生成的么查查方法有没有重复的)
- 每次修改完配置,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版本。
下方分别介绍
假如异常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放里面就行了。讲了那么多,说实话,怎么放都无所谓,你路径指定好就行。
来来来玄学来了:
上面全测试无果的话下面来试试:
- xml里面按空格或者回车保存
- 还是要再说一下,遇事情不行,首先maven clean,Project Invalidatecaches,重启就完事了。先重启再来调BUG。
- 如果你的pom里面包含mybatis-plus,记得要配置mybatis-plus.mapper-locations,只有mybatis.mapper-locations不起作用(这个巨有用,但是mybatis和mybatis-plus是冲突的别一起配置)
- 来个最深层的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逆向生成文件