您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“如何使用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包才會出現這個問題
原來mybatis的facroty需要加載SpringBoot獨特的虛擬文件系統,才能識別類路徑
public SpringBootVFS() { this.resourceResolver = new PathMatchingResourcePatternResolver(getClass().getClassLoader()); }
從以上代碼看,其實是通過PathMatchingResourcePatternResolver實現資源的加載
修復該問題只需要在mybatis的配置類中,設置一下factory即可,
@Bean(name = "masterSqlSessionFactory") @Primary public SqlSessionFactory sqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); bean.setVfs(SpringBootVFS.class);//設置SpringBootVFS bean.setTypeAliasesPackage("com.fulan.domain.red"); ... }
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.Driver url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEnconding=utf-8&useSSL=false&serverTimezone=GMT%2B8 username: root password: root type: com.alibaba.druid.pool.DruidDataSource
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中添加。
<?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> <context id="testTables" targetRuntime="MyBatis3"> <commentGenerator> <!-- 是否去除自動生成的注釋 true:是 : false:否 --> <property name="suppressAllComments" value="true" /> </commentGenerator> <!-- 數據庫連接信息:驅動類、連接地址、用戶名、密碼--> <jdbcConnection driverClass="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,把JDBC DECIMAL 和 NUMERIC 類型解析為 Integer true,把JDBC DECIMAL 和 NUMERIC 類型解析為java.math.BigDecimal --> <javaTypeResolver> <property name="forceBigDecimals" value="false" /> </javaTypeResolver> <!--targetProject:生成PO類的位置--> <javaModelGenerator targetPackage="com.example.springbootmybatis.pojo" targetProject=".srcmainjava"> <!--enableSubPackages:是否讓schema作為包的后綴--> <property name="enableSubPackages" value="false" /> <!-- 從數據庫返回的值被清理前后的空格 --> <property name="trimStrings" value="true" /> </javaModelGenerator> <!--對應的mapper.xml文件 --> <sqlMapGenerator targetPackage="com.example.springbootmybatis.mapper" targetProject=".srcmainjava"> <!--enableSubPackages:是否讓schema作為包的后綴--> <property name="enableSubPackages" value="false" /> </sqlMapGenerator> <!-- 對應的Mapper接口類文件 --> <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.springbootmybatis.mapper" targetProject="./src/main/java"> <!--enableSubPackages:是否讓schema作為包的后綴--> <property name="enableSubPackages" value="false" /> </javaClientGenerator> <!-- 指定數據庫表 --> <table schema="" tableName="users"></table> <!-- 列出要生成代碼的所有表,這里配置的是不生成Example文件 --> <!-- <table tableName="userinfo" domainObjectName="UserInfoPO" --> <!-- enableCountByExample="false" enableUpdateByExample="false" --> <!-- enableDeleteByExample="false" enableSelectByExample="false" --> <!-- selectByExampleQueryId="false"> --> <!-- <property name="useActualColumnNames" value="false" /> --> <!-- </table> --> </context> </generatorConfiguration>
2.3 添加generator配置文件的DTD文件
可以在工具欄中的File->Settings中添加,也可以直接在文件中按alt+shift自動添加。
2.4 運行generator插件生成代碼
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注解
package com.example.springbootmybatis; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @MapperScan("com.example.springbootmybatis.mapper")//指定掃描接口與映射配置文件的包名 public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
mybatis: # 掃描classpath中mapper目錄下的映射配置文件,針對于映射文件放到了resources目錄下 mapper-locations: classpath:/mapper/*.xml # 定義包別名,使用pojo時可以直接使用pojo的類型名稱不用加包名 type-aliases-package: com.example.springbootmybatis.pojo
5.1 創建頁面
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <link rel="shortcut icon" href="../resources/favicon.ico" th:href="@{/static/favion.ico}"> <head> <meta charset="UTF-8"> <title>測試SpringBoot連接PostgreSQL數據庫</title> </head> <body> <form th:action="@{/user/addUser}" method="post"> <input type="text" name="userid"><br> <input type="text" name="username"><br> <input type="text" name="usersex"><br> <input type="submit" value="添加"><br> </form> </body> </html>
5.2 創建Controller
5.2.1 PageController
package com.example.springbootmybatis.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; /** * 頁面跳轉Controller */ @Controller public class PageController { /** * 頁面跳轉方法 */ @RequestMapping("/{page}") public String showPage(@PathVariable String page){ return page; } }
5.2.2 UsersController
package com.example.springbootmybatis.controller; import com.example.springbootmybatis.pojo.Users; import com.example.springbootmybatis.service.UsersService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * 用戶管理Controller */ @RestController @RequestMapping("/user") public class UsersController { @Autowired private UsersService usersService; /** * 添加用戶 */ @PostMapping("/addUser") public String addUsers(Users users){ try { this.usersService.addUsers(users); } catch (Exception e){ e.printStackTrace(); return "error"; } return "redirect:/ok"; } }
5.3 創建Service 接口實現類Impl
/** * 用戶管理業務層 */ @Service public class UsersServiceImpl implements UsersService { @Autowired private UsersMapper usersMapper; @Override @Transactional public void addUsers(Users users) { this.usersMapper.insert(users); } }
接口
public interface UsersService { void addUsers(Users users); }
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
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEnconding=utf-8&useSSL=false&serverTimezone=UTC" userId="username" password="password"> <property name="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配置失敗問題”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。