Maison  >  Article  >  Java  >  Comment SpringBoot résout le problème de l'échec de la configuration des TypeAliases

Comment SpringBoot résout le problème de l'échec de la configuration des TypeAliases

WBOY
WBOYavant
2023-05-16 12:22:111651parcourir

Description du problème

Lors de l'application de MyBatis, utilisez le mappage objet-relationnel pour mapper les objets et Aliase.

Il est clairement écrit dans la documentation Mybatis que si vous ne définissez pas clairement l'Alias ​​de la classe d'entité, le framework utilisera automatiquement le Class Name comme alias.

Ensuite, voici le problème. Lors de l'utilisation de java -jar xxx.jar& pour démarrer, l'erreur suivante sera signalée,

Erreur lors de la résolution de la classe. org .apache.ibatis.type.TypeException : impossible de résoudre l'alias de type "XXXXX". Il est évident que la classe correspondant à alise ne peut pas être récupérée localement, et finalement l'initialisation de sqlSessionFactory et ainsi de suite échoue. De plus, il n'y a aucun problème à démarrer le rail directement dans Idea. Ce problème ne se produira qu'au démarrage du package jar. Le système de mybatis doit charger le système de fichiers virtuel unique de SpringBoot pour identifier le chemin de classe

public SpringBootVFS() {
    this.resourceResolver = new PathMatchingResourcePatternResolver(getClass().getClassLoader());
}
#🎜🎜. #À partir du code ci-dessus, le chargement des ressources est en fait implémenté via PathMatchingResourcePatternResolver

La résolution de ce problème nécessite uniquement Vous devez définir l'usine dans la classe de configuration de mybatis,

@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");
        ...
    }

SpringBoot intègre Mybatis et les pièges rencontrés

1 Construire l'environnement du projet

#🎜 🎜#

1.1 Créer un projet

#🎜 🎜#

1.2 Modifiez le fichier POM et ajoutez les dépendances associées

# 🎜🎜#

Modifiez le fichier pom.xml et ajoutez-y les dépendances suivantes.

<!--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 Configurer la source de données

Comment SpringBoot résout le problème de léchec de la configuration des TypeAliases

Configurez le code suivant dans le fichier 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. Configurer le plugin du générateur Maven

2.1 Ajouter les coordonnées du plugin du générateur

<!--配置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 Ajouter le fichier de configuration du générateur

Nommez le fichier generator.xml et ajoutez-le à 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 Ajouter le fichier DTD du fichier de configuration du générateur

Peut être ajouté dans Fichier->Paramètres dans la barre d'outils, ou directement Appuyez sur alt+shift pour l'ajouter automatiquement au fichier.

2.4 Exécutez le plug-in générateur pour générer du code


Comment SpringBoot résout le problème de léchec de la configuration des TypeAliases3.1 Configurer le plug-in de copie de ressources

3.1 Ajouter un plug-in de copie de ressources- dans les coordonnées#🎜 🎜#

<!--配置资源拷贝插件-->
 <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 Modifiez la classe de démarrage et ajoutez l'annotation @MapperScanComment SpringBoot résout le problème de léchec de la configuration des TypeAliases

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);
 }
}

4.

mybatis:
  # 扫描classpath中mapper目录下的映射配置文件,针对于映射文件放到了resources目录下
  mapper-locations: classpath:/mapper/*.xml
  # 定义包别名,使用pojo时可以直接使用pojo的类型名称不用加包名
  type-aliases-package: com.example.springbootmybatis.pojo
Comment SpringBoot résout le problème de léchec de la configuration des TypeAliases5. Ajouter une fonction utilisateur

5.1 Créer une page

<!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 Créer un contrôleur

# 🎜🎜#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 Créer une classe d'implémentation d'interface de service Impl

#🎜 🎜#
/**
 * 用户管理业务层
 */
@Service
public class UsersServiceImpl implements UsersService {
    @Autowired
    private UsersMapper usersMapper;
    @Override
    @Transactional
    public void addUsers(Users users) {
        this.usersMapper.insert(users);
    }
}

Interface# 🎜🎜#

public interface UsersService {
    void addUsers(Users users);
}
Erreurs rencontrées

1 Le générateur Mybatis est automatiquement généré et la table de base de données du même nom sera également générée#🎜🎜. #

[AVERTISSEMENT] Les utilisateurs de la configuration de table correspondent à plusieurs tables (test..users,performance_schema..users)

[AVERTISSEMENT] Impossible d'obtenir la clé primaire informations de la base de données, les objets générés peuvent être incomplets# 🎜🎜#

a répondu à cette question sur le site officiel de MyBatis Generator.

La traduction est la suivante : Mysql ne peut pas prendre en charge correctement les catalogues et les schémas SQL. Par conséquent, il est préférable de ne pas spécifier de catalogue et de schéma dans le fichier de configuration du générateur, mais simplement de spécifier le nom de la table de données et de spécifier la base de données dans l'URL JDBC. Si vous utilisez la version mysql-connector-java 8.x, le générateur générera du code pour les tables de la base de données d'informations (sys, information_schema, performance_schema) dans MySql. Pour éviter cette opération, veuillez ajouter l'attribut "nullCatalogMeansCurrent=true". à l'URL JDBC.

Modifier le fichier de configuration generateur.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 Une erreur 500 apparaît sur la page


#. 🎜🎜## 🎜🎜#

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>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer