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&amp;characterEnconding=utf-8&amp;useSSL=false&amp;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&amp;characterEnconding=utf-8&amp;useSSL=false&amp;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配置失败问题”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注恰卡编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

发布于 2022-04-03 22:33:42
收藏
分享
海报
0 条评论
34
上一篇:springboot缓存之redis整合的方法 下一篇:springboot项目事务标签验证问题怎么解决
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码