Spring Boot单Jar包实现Web服务与数据导入双任务方案咨询
实现单Jar包双模式运行
1. 控制Web服务是否启动
在Spring Boot启动类中,通过判断命令行参数切换Web服务模式:
@SpringBootApplication public class MyAppApplication { public static void main(String[] args) { SpringApplicationBuilder appBuilder = new SpringApplicationBuilder(MyAppApplication.class); // 检测是否为导入命令 boolean isImportTask = Arrays.stream(args) .anyMatch(arg -> "import".equals(arg)); if (isImportTask) { // 禁用Web服务,仅启动核心Spring上下文 appBuilder.web(WebApplicationType.NONE); } ConfigurableApplicationContext context = appBuilder.run(args); // 导入任务执行完成后自动关闭上下文 if (isImportTask) { context.close(); } } }
2. 让DbImporter仅在导入模式下执行
给DbImporter添加条件注解,确保它只在存在import命令参数时生效:
@Component // 仅当命令行包含"import"参数时激活 @ConditionalOnCommandLineProperty(name = "import", matchIfMissing = false) public class DbImporter implements CommandLineRunner { private final MyDataMapper dataMapper; // 注入其他需要的Bean(如XML解析工具、模型转换器等) // 构造函数注入依赖 public DbImporter(MyDataMapper dataMapper) { this.dataMapper = dataMapper; } @Override public void run(String... args) throws Exception { // 解析命令行参数中的XML文件路径 String xmlFilePath = args[1]; // 1. 解析XML文件为实体对象列表 List<MyDataModel> dataList = parseXmlFile(xmlFilePath); // 2. 调用MyBatis Mapper批量插入数据 dataMapper.batchInsert(dataList); System.out.println("XML数据导入完成,共插入" + dataList.size() + "条记录"); } // 抽离XML解析逻辑为独立方法,方便测试调用 public List<MyDataModel> parseXmlFile(String filePath) throws Exception { // 实现XML解析逻辑(如使用JAXB、DOM4J等) // 示例代码省略 return new ArrayList<>(); } }
执行java -jar my-app.jar时会正常启动Web服务;执行java -jar my-app.jar import dump.xml时会启动无Web模式的Spring上下文,完成导入后自动关闭。
DbImporter集成测试:手动触发执行
1. 避免测试时自动执行DbImporter
给DbImporter添加测试环境排除条件,确保测试上下文不会自动执行它:
@Component @ConditionalOnCommandLineProperty(name = "import", matchIfMissing = false) // 测试环境下不自动注册为CommandLineRunner @ConditionalOnNotProfile("test") public class DbImporter implements CommandLineRunner { // 原有代码不变 }
2. 编写集成测试类
在测试类中手动注入DbImporter,调用其核心方法完成测试:
@SpringBootTest(properties = "spring.profiles.active=test") class DbImporterIntegrationTest { @Autowired private DbImporter dbImporter; @Autowired private MyDataMapper dataMapper; // 测试前清空测试数据库 @BeforeEach void setUp() { dataMapper.truncateTable(); // 需在MyBatis Mapper中定义清空表的方法 } @Test void testXmlImport() throws Exception { // 加载测试用XML文件 String testXmlPath = "src/test/resources/test-data.xml"; // 手动触发导入逻辑 List<MyDataModel> importedData = dbImporter.parseXmlFile(testXmlPath); dataMapper.batchInsert(importedData); // 验证数据是否正确插入 List<MyDataModel> dbData = dataMapper.selectAll(); assertEquals(importedData.size(), dbData.size()); // 可进一步验证每条数据的字段一致性 } }
3. 测试数据库配置
在src/test/resources/application-test.yml中配置测试专用数据库:
spring: datasource: url: jdbc:postgresql://localhost:5432/my_app_test username: test_user password: test_pass mybatis: mapper-locations: classpath:mapper/*.xml
测试时会启动包含所有必要Bean的Spring上下文,但不会自动执行导入逻辑,完全由测试代码手动控制触发时机和参数。
内容的提问来源于stack exchange,提问作者0e39bf7b
相关产品推荐
相关产品推荐

