• Springcloud学习笔记26--JeecgBoot 新建一个微服务模块,同时配置动态数据源(使用两个数据库)


    1.创建一个新的module

     

     

     创建完成后,项目结构为:

     2.创建文件目录、启动类

    (1)在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">
        <parent>
            <artifactId>jeecg-cloud-module</artifactId>
            <groupId>org.jeecgframework.boot</groupId>
            <version>2.4.6</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>org.jeecgframework.boot</groupId>
        <artifactId>jeecg-cloud-test</artifactId>
    
        <dependencies>
            <dependency>
                <groupId>org.jeecgframework.boot</groupId>
                <artifactId>jeecg-boot-base-core</artifactId>
            </dependency>
            <!--引入微服务启动依赖 starter-->
            <dependency>
                <groupId>org.jeecgframework.boot</groupId>
                <artifactId>jeecg-boot-starter-cloud</artifactId>
            </dependency>
    
        </dependencies>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    </project>

    (2)添加配置文件application.yml

    server:
      port: 7004
    spring:
      application:
        name: jeecg-cloud-test

    (3)添加启动类

    package org.jeecg;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.openfeign.EnableFeignClients;
    
    @SpringBootApplication(scanBasePackages = "org.jeecg")
    @EnableFeignClients(basePackages = "org.jeecg")
    public class JeecgCloudTestApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(JeecgCloudTestApplication.class, args);
        }
    }

    启动JeecgCloudTestApplication类,可以看到项目启动成功。

    注意:@EnableFeignClients(basePackages = "org.jeecg")这个注解一定要加上,否则会报‘org.jeecg.common.api.CommonAPI' not be found 错误。

    模块的启动顺序为(1)JeecgNacosApplication nacos应用 (2)JeecgGatewayApplication 网关应用 (3)JeecgCloudTestApplication 测试应用

     此时,查看http://192.168.141.128:8848/nacos/index.html可见

     

     3.在jeecg-cloud-gateway中配置路由信息

    打开jeecg-cloud-gateway模块中的application.yml文件

    添加如下内容

            - id: jeecg-cloud-test
              uri: lb://jeecg-cloud-test
              predicates:
                - Path=/test/**

     4.创建测试类与postman测试

    (1)首先,创建目录和TestController

    @Slf4j
    @Api(tags = "test")
    @RestController
    @RequestMapping("/test")
    public class TestController {
        @GetMapping(value = "/demo")
        @ApiOperation(value = "测试方法", notes = "测试方法")
        public Result methodTest() {
    
            return Result.OK("这是测试方法TestController");
        }
    
    }

    (2)修改gateway网关模块中的路由配置

            - id: jeecg-cloud-test
              uri: lb://jeecg-cloud-test
              predicates:
                - Path=/test/**

    (3)绕开网关,直接访问http://127.0.0.1:7006/test/demo

    5.利用jeecg-boot代码生成器自动生成代码

    具体使用见:https://www.cnblogs.com/luckyplj/p/15393648.html

    注意:代码生成器生成的代码,务必按照包名规则 org.jeecg.modules.*进行初始化,其他请了解jeecgboot mybatis的包扫描规则,不然bean扫描不到!

    如果未按包名规则正确配置,会报如下错误。

    org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'pmSubsysHostsController': Unsatisfied dependency expressed through field 'service'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'pmSubsysHostsServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.jeecg.flep.mapper.PmSubsysHostsMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:643) ~[spring-beans-5.2.10.RELEASE.jar:5.2.10.RELEASE]
        at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:130) ~[spring-beans-5.2.10.RELEASE.jar:5.2.10.RELEASE]  
    Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'pmSubsysHostsServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.jeecg.flep.mapper.PmSubsysHostsMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:643) ~[spring-beans-5.2.10.RELEASE.jar:5.2.10.RELEASE]
        at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:130) ~[spring-beans-5.2.10.RELEASE.jar:5.2.10.RELEASE]
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399) ~[spring-beans-5.2.10.RELEASE.jar:5.2.10.RELEASE]
        ... 20 common frames omitted
    Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.jeecg.flep.mapper.PmSubsysHostsMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1717) ~[spring-beans-5.2.10.RELEASE.jar:5.2.10.RELEASE]
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1273) ~[spring-beans-5.2.10.RELEASE.jar:5.2.10.RELEASE] 
        ... 33 common frames omitted

    正常的模块结构应该如下所示:

    若要自定义包结构,可参考https://www.cnblogs.com/luckyplj/p/15397610.html

    6 配置动态数据源

    (1)动态数据源配置

          datasource:
            master:
              url: jdbc:mysql://jeecg-boot-mysql:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
              username: root
              password: plj824
              driver-class-name: com.mysql.cj.jdbc.Driver
              # 多数据源配置
            multi-datasource1:
              url: jdbc:mysql://localhost:3306/flep?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
              username: root
              password: plj824
              driver-class-name: com.mysql.cj.jdbc.Driver

    master 为主数据源,系统默认数据源
    multi-datasource1 :自定义的第三方数据源,multi-datasource1名称随便定义

    (2)使用 @DS 切换数据源。
    @DS 可以注解在方法上和类上,同时存在方法注解优先于类上注解。

    注解在service实现或mapper接口方法上,但强烈不建议同时在service和mapper注解。 (可能会有问题)

    注解结果
    没有@DS 默认数据源
    @DS("dsName") dsName可以为组名也可以为具体某个库的名称

     代码示例:

    @Service
    @DS("multi-datasource1")
    public class BsClientSubsysServiceImpl extends ServiceImpl<BsClientSubsysMapper, BsClientSubsys> implements IBsClientSubsysService {
    
    }

    此时,利用postman测试。

    参考文献:

    jeecg-boot:注解扫描范围问题    https://blog.csdn.net/gwcgwcjava/article/details/95967349

  • 相关阅读:
    Java基础——Java反射机制
    Java基础——Java常用类
    Java基础——多线程
    Java基础——IO流--转换流、标准输入输出流
    Java基础——IO流
    Java基础——枚举与注解
    Java基础——泛型
    codeforces B. Bear and Strings 解题报告
    codeforces A. Black-and-White Cube 解题报告
    codeforces B. Ping-Pong (Easy Version) 解题报告
  • 原文地址:https://www.cnblogs.com/luckyplj/p/15357692.html
Copyright © 2020-2023  润新知