问题:
最近组里有个项目SpringBoot升级为2.7.11版本后,发现国际化失效,截图如下:
排查:
经过查看源码,发现userResourceBundle为空,进入this.interpolateBundleMessage此方法后解析出来的code对应的msg就是传入的resolveMessage。
下面通过反向追溯userResourceBundle设值方法
发现项目里有个WebMvcConfig类注入了MessageSourceResourceBundleLocator实例
新版本springboot虽然也触发了这个bean注入,但是国际化转换时却没有正确的引用,导致解析msg失败。后面发现WebMvcConfigurer接口有个getValidator()方法可以重写,就改为重写此方法方式,测试后,可以成功解析msg。
WebMvcConfig重写方法如下:
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {@Autowired
private MessageSource messageSource;
@Bean
public LocaleResolver localeResolver() {
return new MyLocaleResolver();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new ApiLogInterceptor());
}
/**
* 这是原来版本中的写法
* @return
*/
//@Bean
//public Validator validator() {
// LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
// 设置校验快速失败模式
// validator.getValidationPropertyMap().put(HibernateValidatorConfiguration.FAIL_FAST, "true");
// validator.setValidationMessageSource(messageSource);
// return validator;
//}
/**
* 新版本中写法
* @return
*/
@Bean
@Override
public org.springframework.validation.Validator getValidator() {
LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
// 设置校验快速失败模式
validator.getValidationPropertyMap().put(HibernateValidatorConfiguration.FAIL_FAST, "true");
validator.setValidationMessageSource(messageSource);
return validator;
}}
结论:
问题解决有点误打误撞的感觉,自己读源码能力还需要继续提升,在此记录下,后续有时间继续研究下为啥不能正常加载正确的对应解析实例对象。