You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 10:45:01