解决在springboot测试中@value 获取server.port=-1情况

本文解决了一个在SpringBoot测试环境下,应用配置文件中定义的端口未能正确加载的问题。通过调整@SpringBootTest注解,使用DEFINED_PORT选项,确保了测试环境能够识别并使用配置文件中的端口设置。

问题描述

application.yml部分配置配置项如下:

server:
  port: 8080
domain: localhost

配置项对应的类代码如下:

@Component
@Data
public class SiteConfig {
    //域名
    @Value("${domain:#{null}}")
    private String domain;
    //端口号
    @Value("${server.port:#{8081}}")
    private Integer port;
}

测试类代码如下:

@Slf4j
@SpringBootTest
class SiteConfigTest {

    @Resource
    private SiteConfig siteConfig;
    
    @Test
    void getDomain() {
        log.info("siteConfig: {}", siteConfig.getDomain());
        assertEquals("localhost", siteConfig.getDomain());
    }

    @Test
    void getPort() {
        log.info("Port: {}", siteConfig.getPort());
        assertEquals(8080, siteConfig.getPort());
    }
}

在测试方法getPort()中,端口号port获取的值为-1。

原因

测试类启动springboot程序时并没有以配置端口启动服务,所以我们要以配置端口的方式启动服务。
org.springframework.boot.test.context.SpringBootContextLoader#getInlinedProperties

protected String[] getInlinedProperties(MergedContextConfiguration config) {
    ArrayList<String> properties = new ArrayList<String>();
    // JMX bean names will clash if the same bean is used in multiple contexts
    disableJmx(properties);
    properties.addAll(Arrays.asList(config.getPropertySourceProperties()));
    if (!isEmbeddedWebEnvironment(config) && !hasCustomServerPort(properties)) {
        properties.add("server.port=-1");
    }
    return properties.toArray(new String[properties.size()]);
}

解决

@SpringBootTest中添加属性值@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)

@Slf4j
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
class SiteConfigTest {

    @Resource
    private SiteConfig siteConfig;
    
    @Test
    void getDomain() {
        log.info("siteConfig: {}", siteConfig.getDomain());
        assertEquals("localhost", siteConfig.getDomain());
    }

    @Test
    void getPort() {
        log.info("Port: {}", siteConfig.getPort());
        assertEquals(8080, siteConfig.getPort());
    }
}

参考

https://stackoverflow.com/questions/46684818/springboot-test-valueserver-port

<think>我们正在讨论在CentOS上运行SpringBoot应用程序时如何通过命令行参数配置数据库连接。根据用户的问题,他想要一个具体的命令参数示例,用于通过`java-jar`命令启动SpringBoot应用时设置数据库连接参数。在SpringBoot中,我们通常通过`application.properties`或`application.yml`文件来配置数据库连接。但是,我们也可以通过命令行参数来覆盖这些配置。命令行参数可以以`--property=value`的形式提供。对于数据库连接,常见的参数包括:-`spring.datasource.url`:数据库URL-`spring.datasource.username`:数据库用户名-`spring.datasource.password`:数据库密码-`spring.datasource.driver-class-name`:数据库驱动类名(如果无法自动检测)假设我们使用MySQL数据库,那么一个典型的命令行参数示例为:```bashjava-jaryour-application.jar\--spring.datasource.url=jdbc:mysql://localhost:3306/your_database\--spring.datasource.username=your_username\--spring.datasource.password=your_password```注意:1.如果SpringBoot应用已经内置了MySQL驱动(比如在pom.xml中依赖了`mysql-connector-java`),那么我们不需要指定驱动类名,SpringBoot会自动识别。2.如果使用其他数据库,URL和驱动类名会有所不同。此外,根据引用[4]中的内容,如果数据库不在本地,或者需要通过SSH隧道访问,则需要进行额外的配置。但根据用户的问题,他仅询问如何通过命令行参数配置数据库连接,因此我们只关注命令行参数本身。如果用户的应用连接数据库时遇到类找不到的问题(如引用[2]中的错误),可能是缺少数据库驱动依赖。这需要在项目的构建文件(如pom.xml)中添加相应的依赖。但是,用户的问题是关于命令行参数的,所以我们在此不展开。基于上述,提供一个在CentOS上运行的示例命令:```bashjava-jar/path/to/springboot-app.jar\--spring.datasource.url=jdbc:mysql://your_db_host:3306/your_db\--spring.datasource.username=db_user\--spring.datasource.password=db_password```这里需要注意:-将`/path/to/springboot-app.jar`替换为实际的jar包路径。-将`your_db_host`、`your_db`、`db_user`、`db_password`替换为实际的数据库连接信息。另外,如果数据库连接需要额外的配置(如SSL、时区等),也可以在URL中指定参数。例如,设置时区:```bash--spring.datasource.url=jdbc:mysql://your_db_host:3306/your_db?serverTimezone=UTC```最后,如果用户的环境变量中包含这些配置,也可以使用环境变量来设置,但在命令行中直接传递参数更为直接。因此,我们给出的主要解决方案就是通过命令行参数传递数据库连接信息。</think> 在 CentOS 上运行 Spring Boot 应用程序并通过命令行配置数据库连接的参数示例如下: ### 基础配置示例 ```bash java -jar your-app.jar \ --spring.datasource.url=jdbc:mysql://localhost:3306/your_db \ --spring.datasource.username=your_username \ --spring.datasource.password=your_password \ --spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver ``` ### 重要参数说明 | 参数格式 | 说明 | 示例 | |---------|------|------| | `--spring.datasource.url` | 数据库连接URL | `jdbc:mysql://db-server:3306/mydb` | | `--spring.datasource.username` | 数据库用户名 | `--spring.datasource.username=admin` | | `--spring.datasource.password` | 数据库密码 | `--spring.datasource.password=Pass123!` | | `--spring.datasource.driver-class-name` | JDBC驱动类 | `com.mysql.cj.jdbc.Driver` | ### 高级配置选项 1. **连接池配置**: ```bash --spring.datasource.hikari.maximum-pool-size=20 \ --spring.datasource.hikari.connection-timeout=30000 ``` 2. **多数据源配置**: ```bash --spring.datasource.secondary.url=jdbc:postgresql://192.168.1.100:5432/db2 \ --spring.datasource.secondary.username=user2 \ --spring.datasource.secondary.password=pass2 ``` 3. **通过SSH隧道连接数据库**(需预先建立隧道): ```bash # 首先建立SSH隧道 ssh -L 63306:db-server:3306 user@ssh-gateway -N & # 然后连接本地隧道端口 java -jar app.jar --spring.datasource.url=jdbc:mysql://localhost:63306/your_db ``` ### 注意事项 1. **URL参数规范**: ```bash # MySQL示例(含时区和SSL配置) --spring.datasource.url=jdbc:mysql://dbserver:3306/mydb?useSSL=true&serverTimezone=UTC # PostgreSQL示例 --spring.datasource.url=jdbc:postgresql://pg-server:5432/mydb ``` 2. **安全建议**: - 使用环境变量存储密码:`--spring.datasource.password=${DB_PASSWORD}` - 生产环境建议使用配置中心(如Spring Cloud Config) 3. **依赖验证**: 确保在 `pom.xml` 中已添加对应数据库驱动: ```xml <!-- MySQL 驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> ``` 如果出现 `NoClassDefFoundError`,通常表示缺少数据库驱动依赖,请检查项目的依赖配置[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值