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
相关产品推荐
相关产品推荐

