SpringBoot怎么解决TypeAliases配置失败问题
SpringBoot怎么解决TypeAliases配置失败问题
这篇文章主要介绍“SpringBoot怎么解决TypeAliases配置失败问题”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot怎么解决TypeAliases配置失败问题”文章能帮助大家解决问题。
问题描述
在应用MyBatis时,使用对象关系映射,将对象和Aliase映射起来。
在Mybatis的文档明确写出,如果你没有明确定义实体类的Aliase,框架会自动将Class Name自动作为别名。
那么问题来了,当使用java -jar xxx.jar&启动的时候,会报出以下错误,
Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type alias "XXXXX".Cause: java.lang.ClassNotFoundException: Cannot find class: XXXXX
从异常信息来看,明显就是无法从本地检索到alise对应的类,并最终导致sqlSessionFactory等初始化失败。而且吊轨的是,直接在Idea中启动是没有问题的,启动jar包才会出现这个问题
解决方法
参考博主A_Beaver的文章,原来mybatis的facroty需要加载SpringBoot独特的虚拟文件系统,才能识别类路径
publicSpringBootVFS(){this.resourceResolver=newPathMatchingResourcePatternResolver(getClass().getClassLoader());}
从以上代码看,其实是通过PathMatchingResourcePatternResolver实现资源的加载
修复该问题只需要在mybatis的配置类中,设置一下factory即可,
@Bean(name="masterSqlSessionFactory")@PrimarypublicSqlSessionFactorysqlSessionFactory(@Qualifier("masterDataSource")DataSourcedataSource)throwsException{SqlSessionFactoryBeanbean=newSqlSessionFactoryBean();bean.setDataSource(dataSource);bean.setVfs(SpringBootVFS.class);//设置SpringBootVFSbean.setTypeAliasesPackage("com.fulan.domain.red");...}
SpringBoot整合Mybatis及遇到的坑
1. 搭建项目环境
1.1 创建项目
1.2 修改POM文件,添加相关依赖
修改pom.xml文件,在其中添加下面依赖。
<!--Thymeleaf启动器--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--mybatis启动器--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.3</version></dependency><!--jdbc启动器--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!--数据库驱动坐标--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.12</version></dependency><!--Druid数据源依赖--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.10</version></dependency>
1.3 配置数据源
在application.yml文件中配置如下代码。
spring:datasource:driver-class-name:com.mysql.cj.jdbc.Driverurl:jdbc:mysql://localhost:3306/test?useUnicode=true&characterEnconding=utf-8&useSSL=false&serverTimezone=GMT%2B8username:rootpassword:roottype:com.alibaba.druid.pool.DruidDataSource
2. 配置Maven的generator插件
2.1 添加generator插件坐标
<!--配置generator插件--><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.4.0</version><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.12</version></dependency></dependencies><!--指定配置文件的路径--><configuration><configurationFile>${project.basedir}/src/main/resources/generator.xml</configurationFile><verbose>true</verbose><overwrite>true</overwrite></configuration></plugin>
2.2 添加generator配置文件
将文件命名为generator.xml,在src/main/resources中添加。
<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEgeneratorConfigurationPUBLIC"-//mybatis.org//DTDMyBatisGeneratorConfiguration1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><generatorConfiguration><contextid="testTables"targetRuntime="MyBatis3"><commentGenerator><!--是否去除自动生成的注释true:是:false:否--><propertyname="suppressAllComments"value="true"/></commentGenerator><!--数据库连接信息:驱动类、连接地址、用户名、密码--><jdbcConnectiondriverClass="com.mysql.cj.jdbc.Driver"connectionURL="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEnconding=utf-8&useSSL=false&serverTimezone=UTC"userId="root"password="root"></jdbcConnection><!--默认false,把JDBCDECIMAL和NUMERIC类型解析为Integertrue,把JDBCDECIMAL和NUMERIC类型解析为java.math.BigDecimal--><javaTypeResolver><propertyname="forceBigDecimals"value="false"/></javaTypeResolver><!--targetProject:生成PO类的位置--><javaModelGeneratortargetPackage="com.example.springbootmybatis.pojo"targetProject=".srcmainjava"><!--enableSubPackages:是否让schema作为包的后缀--><propertyname="enableSubPackages"value="false"/><!--从数据库返回的值被清理前后的空格--><propertyname="trimStrings"value="true"/></javaModelGenerator><!--对应的mapper.xml文件--><sqlMapGeneratortargetPackage="com.example.springbootmybatis.mapper"targetProject=".srcmainjava"><!--enableSubPackages:是否让schema作为包的后缀--><propertyname="enableSubPackages"value="false"/></sqlMapGenerator><!--对应的Mapper接口类文件--><javaClientGeneratortype="XMLMAPPER"targetPackage="com.example.springbootmybatis.mapper"targetProject="./src/main/java"><!--enableSubPackages:是否让schema作为包的后缀--><propertyname="enableSubPackages"value="false"/></javaClientGenerator><!--指定数据库表--><tableschema=""tableName="users"></table><!--列出要生成代码的所有表,这里配置的是不生成Example文件--><!--<tabletableName="userinfo"domainObjectName="UserInfoPO"--><!--enableCountByExample="false"enableUpdateByExample="false"--><!--enableDeleteByExample="false"enableSelectByExample="false"--><!--selectByExampleQueryId="false">--><!--<propertyname="useActualColumnNames"value="false"/>--><!--</table>--></context></generatorConfiguration>
2.3 添加generator配置文件的DTD文件
可以在工具栏中的File->Settings中添加,也可以直接在文件中按alt+shift自动添加。
2.4 运行generator插件生成代码
3. 配置资源拷贝插件
3.1 添加资源拷贝插件坐标
<!--配置资源拷贝插件--><resources><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes></resource><resource><directory>src/main/resources</directory><includes><include>**/*.yml</include></includes></resource></resources>
3.2 修改启动类添加@MapperScan注解
packagecom.example.springbootmybatis;importorg.mybatis.spring.annotation.MapperScan;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication@MapperScan("com.example.springbootmybatis.mapper")//指定扫描接口与映射配置文件的包名publicclassDemoApplication{publicstaticvoidmain(String[]args){SpringApplication.run(DemoApplication.class,args);}}
4. 其他配置项
mybatis:#扫描classpath中mapper目录下的映射配置文件,针对于映射文件放到了resources目录下mapper-locations:classpath:/mapper/*.xml#定义包别名,使用pojo时可以直接使用pojo的类型名称不用加包名type-aliases-package:com.example.springbootmybatis.pojo
5. 添加用户功能
5.1 创建页面
<!DOCTYPEhtml><htmlxmlns:th="http://www.thymeleaf.org"><linkrel="shortcuticon"href="../resources/favicon.ico"th:href="@{/static/favion.ico}"><head><metacharset="UTF-8"><title>测试SpringBoot连接PostgreSQL数据库</title></head><body><formth:action="@{/user/addUser}"method="post"><inputtype="text"name="userid"><br><inputtype="text"name="username"><br><inputtype="text"name="usersex"><br><inputtype="submit"value="添加"><br></form></body></html>
5.2 创建Controller
5.2.1 PageController
packagecom.example.springbootmybatis.controller;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.PathVariable;importorg.springframework.web.bind.annotation.RequestMapping;/***页面跳转Controller*/@ControllerpublicclassPageController{/***页面跳转方法*/@RequestMapping("/{page}")publicStringshowPage(@PathVariableStringpage){returnpage;}}
5.2.2 UsersController
packagecom.example.springbootmybatis.controller;importcom.example.springbootmybatis.pojo.Users;importcom.example.springbootmybatis.service.UsersService;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.PostMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;/***用户管理Controller*/@RestController@RequestMapping("/user")publicclassUsersController{@AutowiredprivateUsersServiceusersService;/***添加用户*/@PostMapping("/addUser")publicStringaddUsers(Usersusers){try{this.usersService.addUsers(users);}catch(Exceptione){e.printStackTrace();return"error";}return"redirect:/ok";}}
5.3 创建Service 接口实现类Impl
/***用户管理业务层*/@ServicepublicclassUsersServiceImplimplementsUsersService{@AutowiredprivateUsersMapperusersMapper;@Override@TransactionalpublicvoidaddUsers(Usersusers){this.usersMapper.insert(users);}}
接口
publicinterfaceUsersService{voidaddUsers(Usersusers);}
遇到的错误
1. Mybatis Generator自动生成,数据库的同名表也会生产的问题
[WARNING] Table Configuration users matched more than one table (test..users,performance_schema..users)
[WARNING] Cannot obtain primary key information from the database, generated objects may be incomplete
在 MyBatis Generator官网 中对这一问题做出了解答。
翻译如下:Mysql 无法正常支持 SQL catalogs 和 schema。因此,最好不要在 generator 配置文件中指定 catalog 以及schema,仅需指定数据表的名字并在 JDBC URL 中指定数据库即可。如果使用 mysql-connector-java 8.x 版本,generator 会为MySql中信息数据库(sys, information_schema, performance_schema)的表生成代码,若要避免这种操作,请在 JDBC URL 中加入属性“nullCatalogMeansCurrent=true”。
修改配置文件generator.xml
<jdbcConnectiondriverClass="com.mysql.cj.jdbc.Driver"connectionURL="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEnconding=utf-8&useSSL=false&serverTimezone=UTC"userId="username"password="password"><propertyname="nullCatalogMeansCurrent"value="true"/></jdbcConnection>
2. 页面出现500错误
2020-06-27 14:23:42.459 ERROR 19676 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Circular view path [addUsers]: would dispatch back to the current handler URL [/addUsers] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)] with root cause
javax.servlet.ServletException: Circular view path [addUsers]: would dispatch back to the current handler URL [/addUsers] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)
at org.springframework.web.servlet.view.InternalResourceView.prepareForRendering(InternalResourceView.java:210) ~[spring-webmvc-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at
解决方法
查了很多博客,但是都不是自己的问题,自己的问题是在pom.xml配置文件中的资源路径中,没有写所有,而是单独的xml和yml配置文件。要加载所有的静态资源。
<!--原本的--><!--资源文件的路径--><resource><directory>src/main/resources</directory><includes><include>**/*.yml</include><include>**/*.xml</include></includes><!--<filtering>false</filtering>--></resource><!--修改后的--><!--资源文件的路径--><resource><directory>src/main/resources</directory><includes><include>**/*.*</include></includes><!--<filtering>false</filtering>--></resource>
关于“SpringBoot怎么解决TypeAliases配置失败问题”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注恰卡编程网行业资讯频道,小编每天都会为大家更新不同的知识点。
推荐阅读
-
vue动态添加删除输入框(springboot vue怎么让数据库显示出来)
springbootvue怎么让数据库显示出来?一般情况下是前端调阅后端接口,来获取到数据库的数据,后端哪里会把数据库的数据整理...
-
springboot实现基于aop的切面日志
本文实例为大家分享了springboot实现基于aop的切面日志的具体代码,供大家参考,具体内容如下通过aop的切面方式实现日志...
-
SpringBoot定时任务功能怎么实现
-
SpringBoot中的@Import注解怎么使用
-
SpringBoot整合Lombok及常见问题怎么解决
-
springboot图片验证码功能模块怎么实现
-
Springboot+SpringSecurity怎么实现图片验证码登录
-
SpringBoot注解的知识点有哪些
SpringBoot注解的知识点有哪些这篇“SpringBoot注...
-
SpringBoot2.x中management.security.enabled=false无效怎么解决
-
springboot怎么禁用某项健康检查
springboot怎么禁用某项健康检查今天小编给大家分享一下sp...