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

Spring Boot数组配置属性重复请求出现双引号问题排查

问题描述

在application.properties中的配置项:

x.y = A BC, A BC DEF

初始化配置的Java代码:

@ConfigurationProperties(prefix = "x")
@ConfigurationPropertiesScan
@Getter
@Setter
@RequiredArgsConstructor
public class MyProperties {
    @NotBlank
    private final String[] y;
}

现象:服务器重启后首次请求时,打印x.getY()的字符串结果为(A BC, A BC DEF),但后续请求中结果变为("A BC", "A BC DEF"),数组元素被额外的双引号包裹。已尝试使用\u0020转义、空格转义符\ 、"A BC", "A BC DEF"、[A BC, A BC DEF]等配置方式,均未解决。

环境:Spring Boot 3.2.3,Java/javac 17.0.10

解决方案

以下几种方法可解决数组元素被双引号包裹的问题:

方法1:改用List替代数组类型

将数组类型改为List<String>,调整字段初始化逻辑(移除final,避免构造器注入带来的绑定冲突):

@ConfigurationProperties(prefix = "x")
@ConfigurationPropertiesScan
@Getter
@Setter
public class MyProperties {
    @NotBlank
    private List<String> y;
}

配置保持原格式x.y = A BC, A BC DEF即可,List的默认toString输出不会自动添加双引号。

方法2:自定义String[]类型转换器

若必须使用数组类型,可自定义转换器覆盖默认绑定逻辑,强制去除元素的引号:

@Component
public class StringArrayConverter implements Converter<String, String[]> {
    @Override
    public String[] convert(String source) {
        if (source == null || source.isBlank()) {
            return new String[0];
        }
        return Arrays.stream(source.split(","))
                .map(str -> str.trim().replaceAll("^\"|\"$", ""))
                .toArray(String[]::new);
    }
}

注册该转换器后,无论配置中是否带引号,都会被统一处理为无引号的元素。

方法3:禁用配置自动刷新

若问题由配置自动刷新(如Spring Cloud Config或actuator的refresh端点触发)导致,可禁用自动刷新逻辑,确保配置仅在启动时绑定一次:

  • 若使用actuator,移除spring-boot-starter-actuator中与refresh相关的配置,或在application.properties添加:
spring.cloud.refresh.enabled=false
  • 确保MyProperties类未使用@RefreshScope注解。

内容的提问来源于stack exchange,提问作者Tdp 17

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 11:17:08