自定义MessageSource以及找不到对应国际化文件问题排查

1.由于在yml中配置的国际化路径会被其他jar包中的yml所覆盖,因此自定义一个MessageSource进行国际化转义

  • 自定义messageSource

  • 生成工具类,通过调用工具类的getMessage方法进行国际化

2.在线上部署时出现问题,国际化不生效,但本地国际化文件生效

  • 初步定位问题:本地的LocaleContextHolder.getLocale()得到的Locale类型为zh_CN

    而线上部署时候该方法得到的Locale类型为en_US

  • 源码定位

 

 localeContext为null的原因:由于是在程序启动时期调用该方法因此无法获取到LocaleContext,如果是通过request请求则会返回当前thread对应的上下文

// 该方法返回系统默认的Locale,由于线上环境Locale为en_US,
// 本地为zh_CN所以导致线上环境无法取到对应的国际化转义
return (defaultLocale != null ? defaultLocale : Locale.getDefault());

3.由于存在必须要在程序初始化时进行国际化转义的语句,因此希望通过在yml中配置一个属性language,可以灵活修改国际化转义类型。

 

 为了测试该方法获取Locale是否生效,创建两个不同语言类型的bundle文件

 在此基础上我认为,在程序初始化时调用getMessage方法进行转义时error文件中的语句应该转义失败,而message中的应该转义成功,但结果时两者都成功了

4.跟踪源码排查两者都成功的原因(以下均为源码)

 

 

 

 

 

 

 

 

 

 

5.结论

对于messageSource的getMessage方法

@Nullable
String getMessage(String code, @Nullable Object[] args, @Nullable String defaultMessage, Locale locale);

即使传入指定Locale,如果无法获取国际化文件对应该locale的转义文件,系统则会返回系统语言对应的转义文件

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值