记SpringBoot升级后国际化失效问题

233 阅读1分钟

问题:

最近组里有个项目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;
    }}

结论:

问题解决有点误打误撞的感觉,自己读源码能力还需要继续提升,在此记录下,后续有时间继续研究下为啥不能正常加载正确的对应解析实例对象。