使用SpringBoot的CommandLineRunner遇到的坑及解决

使用Spring Boot的CommandLineRunner接口可以在应用程序启动时运行一些代码。但是在使用CommandLineRunner时,可能会遇到一些坑,下面是攻略及相应示例:

坑点及解决方案

1. CommandLineRunner执行顺序问题

在项目中可能会有多个CommandLineRunner实现类,SpringBoot在执行CommandLineRunner的时候并没有给出特定的执行顺序,所以需要开发者来指定使用@Order注解进行指定执行顺序。如下所示:

@Component
@Order(1)
public class CommandLineRunner1 implements CommandLineRunner {
    @Override
    public void run(String... args) throws Exception {
        System.out.println("CommandLineRunner1");
    }
}

@Component
@Order(2)
public class CommandLineRunner2 implements CommandLineRunner {
    @Override
    public void run(String... args) throws Exception {
        System.out.println("CommandLineRunner2");
    }
}

2. CommandLineRunner无法被单元测试覆盖到问题

由于CommandLineRunner是Spring容器启动之后执行的代码,而在单元测试中,启动Spring容器是无法将CommandLineRunner的代码也由JUnit所控制。对于这种情况,可以使用Spring-boot-starter-test提供的“TestResttemplate”来模拟外部调用,从而触发CommandLineRunner的执行流程。

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class CommandLineRunnerTests {
    @Autowired
    private TestRestTemplate restTemplate;

    @Test
    public void testCommandLineRunner() {
        // 模拟外部调用
        ResponseEntity<String> response = restTemplate.getForEntity("/", String.class);
        assertThat(response.getStatusCode().value()).isEqualTo(200);
    }
}

示例

接下来我们用示例来演示如何使用CommandLineRunner,以及如何应对上述两个坑点。

示例1

  1. 创建CommandLineRunner1
@Component
@Order(1)
public class CommandLineRunner1 implements CommandLineRunner {
    @Override
    public void run(String... args) throws Exception {
        System.out.println("CommandLineRunner1");
    }
}
  1. 创建CommandLineRunner2
@Component
@Order(2)
public class CommandLineRunner2 implements CommandLineRunner {
    @Override
    public void run(String... args) throws Exception {
        System.out.println("CommandLineRunner2");
    }
}
  1. 启动测试

启动Spring Boot应用程序并观察控制台输出,你会看到输出的顺序为:

CommandLineRunner1
CommandLineRunner2
  1. 结论

通过添加@Order(1)和@Order(2)注释,可以按照指定的顺序运行CommandLineRunner。

示例2

  1. 创建CommandLineRunner类
@Component
public class CommandLineRunnerImpl implements CommandLineRunner {
    @Override
    public void run(String... args) throws Exception {
        System.out.println("CommandLineRunner execute success.");
    }
}
  1. 创建测试类
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class CommandLineRunnerTests {
    @Autowired
    private TestRestTemplate restTemplate;

    @Test
    public void test() {
        ResponseEntity<String> response = restTemplate.getForEntity("/", String.class);
        assertThat(response.getStatusCode().value()).isEqualTo(200);
    }
}
  1. 控制器设置
@RestController
public class IndexController {
    @GetMapping("/")
    public String index() {
        return "Hello, world!";
    }
}
  1. 启动测试

启动JUnit测试并观察控制台输出,你可以看到运行"CommandLineRunner execute success."的信息,并且可以进行正常的HTTP调用!

总结

在使用Spring Boot的CommandLineRunner时,要注意以上两个坑。使用@Order注解可以解决多个CommandLineRunner类的执行顺序问题, TestRestTemplate类可以模拟外部调用来触发CommandLineRunner接口的执行流程。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用SpringBoot的CommandLineRunner遇到的坑及解决 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • 浅谈PowerShell 捕获错误

    关于 PowerShell 捕获错误的攻略,我们可以分为以下几个方面进行介绍: 异常处理 在 PowerShell 中,可以使用 try-catch 块对异常进行处理,具体语法如下: try { # 执行可能会有异常的代码 } catch { # 处理异常信息 } 其中,try 块中的代码就是可能会出现异常的代码块。如果有异常发生了,就会进入 catch 块…

    C 2023年5月22日
    00
  • 详解ubuntu安装opencv的正确方法

    详解Ubuntu安装OpenCV的正确方法 OpenCV是一个非常流行的开源计算机视觉库,它能够处理各种图像和视频处理任务。本文将详细介绍Ubuntu系统中安装OpenCV的正确方法。 步骤1:更新系统软件包 在安装OpenCV之前,我们需要确保系统中的软件包是最新的。为此,我们可以使用以下命令更新软件包: sudo apt update sudo apt …

    C 2023年5月22日
    00
  • C语言实现的统计php代码行数功能源码(支持文件夹、多目录)

    以下是C语言实现的统计php代码行数功能源码的完整攻略: 1. 简介 本文介绍如何使用C语言统计PHP代码行数的方法,这个方法是支持多文件夹和多目录的。 主要思路是通过递归遍历文件夹来实现多文件的读取和处理,然后对代码行进行统计。 2. 核心代码实现 2.1. 处理单个文件 我们首先来看如何处理单个文件的代码行数统计。这个过程分为三个步骤: 打开文件,将其读…

    C 2023年5月24日
    00
  • C语言实现自动售货机

    C语言实现自动售货机 介绍 自动售货机在我们的生活中随处可见,它们可以提高购物的便利性,节约时间和精力。本文介绍如何使用C语言实现一个简单的自动售货机。 设计思路 自动售货机主要包含以下几个部分:1. 商品展示界面2. 商品选择3. 支付界面4. 出货过程 实现步骤 1. 商品展示界面 首先需要在屏幕上显示商品的种类和价格,可以使用以下的代码块实现: pri…

    C 2023年5月23日
    00
  • C语言用函数指针实现一个特别的计算器

    C语言用函数指针实现一个特别的计算器 1. 什么是函数指针 在C语言中,函数指针是指向函数的指针变量,也就是说,函数指针存储的是一个函数的地址。通过函数指针,我们可以直接调用该函数,就像调用普通变量一样,这样可以使程序更加灵活。 定义一个函数指针需要注意两点:- 函数指针的声明方式与普通指针有所不同,其声明格式为 返回类型 (*指针变量名)(参数列表);- …

    C 2023年5月23日
    00
  • TPLINK TLR5408PE-AC一体VPN路由器怎么样? tpr5408pe测评

    TPLINK TLR5408PE-AC一体VPN路由器怎么样? 简介 TPLINK TLR5408PE-AC是一款集成了VPN功能的路由器。它支持IEEE802.11ac无线网络标准,最高可达1300Mbps,同时支持IPv4和IPv6协议,提供了4个Gigabit以太网口和2个USB接口。另外,它还支持PPTP、L2TP、IPSec和SSL VPN等多种安…

    C 2023年5月23日
    00
  • 深入分析javascript中的错误处理机制

    深入分析JavaScript中的错误处理机制 在JavaScript中,错误处理是一个非常重要的话题。良好的错误处理可以帮助我们更好地调试和优化程序,提高程序的稳定性和可靠性。本文将介绍JavaScript中的错误处理机制,包括错误类型、错误捕获和处理方式等。 错误类型 在JavaScript中,有三种错误类型: 语法错误(SyntaxError):由于编写…

    C 2023年5月23日
    00
  • Linux中生成Core Dump系统异常信息记录文件的教程

    生成Core Dump文件一般用于分析程序在运行过程中出现的异常情况,其中包含了详细的系统异常信息。下面是在Linux系统中生成Core Dump文件的教程: 1. 设置ulimit值 在生成Core Dump文件前,要先设置ulimit值,其中ulimit -c设置生成Core Dump文件的大小(单位:KB),ulimit -S -c 0表示不生成任何C…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部