@WebMvcTest无法解析@Value注解配置值的问题求助
解决建议
1. 确保测试环境加载配置文件
在测试类上添加@TestPropertySource注解,明确指定配置文件路径,让Spring能正确读取配置值:
@WebMvcTest(controllers = TodoController.class) @TestPropertySource(locations = "classpath:application.properties") @ContextConfiguration(classes = {MessageSourceConfig.class, TodoController.class}, initializers = ConfigDataApplicationContextInitializer.class) class TodoControllerTest { // ... 原有代码 }
如果使用测试专用配置文件,可将路径指定为src/test/resources下的对应文件。
2. 修正@Value注入的类型匹配问题
配置文件中spring.messages.basename是单个字符串值,用String[]接收虽支持自动转换,但显式处理更稳妥,避免潜在解析问题:
修改MessageSourceConfig:
@Configuration public class MessageSourceConfig { @Value("${spring.messages.basename}") private String basename; @Bean public ReloadableResourceBundleMessageSource messageSource() { ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); messageSource.setBasenames(basename.split(",")); // 兼容多配置用逗号分隔的场景 messageSource.setDefaultEncoding(StandardCharsets.UTF_8.name()); return messageSource; } }
3. 排除Spring自动配置的MessageSource
@WebMvcTest默认会自动配置MessageSource,可能覆盖自定义配置。可在注解中排除自动配置类,确保自定义的MessageSourceConfig生效:
@WebMvcTest(controllers = TodoController.class, excludeAutoConfiguration = MessageSourceAutoConfiguration.class) @TestPropertySource(locations = "classpath:application.properties") @ContextConfiguration(classes = {MessageSourceConfig.class, TodoController.class}) class TodoControllerTest { // ... 原有代码 }
4. 验证配置文件位置
确认application.properties存在于src/main/resources或src/test/resources目录下。若测试需单独配置,可在src/test/resources下创建同名文件,保证测试时能读取到正确的spring.messages.basename值。
内容的提问来源于stack exchange,提问作者Sha
相关产品推荐
相关产品推荐

