springboot 使用国际话自定义localeResolver 不生效

今天闲着没事,搞一下springboot ,当阅读官方文档i18n 时,闲来没事想搞一下。下面简单步骤:

关键步骤:我们首先想到国际化跟locale 有关,使用springboot 最关键的就是看自动配置,那么我们首先看下webmvc 自动配置类,springboot 使用国际话自定义localeResolver 不生效

国际化关键配置,大概意思就是如果容器中没有LocaleResolver 对象,如果没有该对象就创建一个LocaleResolver 。这点是关键,后面会提到。

配置:springboot 使用国际话自定义localeResolver 不生效

配置关键

springboot 使用国际话自定义localeResolver 不生效

我们上面怎么知道配login 基础名,这里啰嗦一下这要看我们messageresource 自动配置类怎么匹配的,知道原理就666了。

springboot 使用国际话自定义localeResolver 不生效

大概意思就是如果没有配置基础名则使用默认message ,如果我们配置了基础名则使用我们配置的,这也是springboot 的一个套路。

下面讲一下我遇到的不生效问题,都知道springboot 一个亮点就是无xml 配置,那么我们创建一个国际化解析器来简单识别英文与中文

springboot 使用国际话自定义localeResolver 不生效

在我们资源文件中配置该对象

springboot 使用国际话自定义localeResolver 不生效

这个我们创建成功页面,然后放置中文和英文切换,

springboot 使用国际话自定义localeResolver 不生效

当我们点击中文及english 时进行切换,但是遇到问题了,点击参数链接请求都是ok的,但是就是没用,刚开始以为国际化配置有错误,在这里给个简单的实用方式,打开浏览器设置切换语言设置,此时可以正常切换,那么问题肯定出在了解析上,此时看我们上图LocaleReolver 中,如果没有创建就创建默认的,打断点,重新启动可以知道我们自己写的解析类依然被容器创建,但是当我们请求时并没有走我们的方法,可想而知走的还是默认配置,查看源码@ConditionalOnMissingBean 注解当我们没有时创建,进行debug 模式启动看到

springboot 使用国际话自定义localeResolver 不生效

确实没有创建localeResolver ,此时你是否发现问题?不卖关子了,我们在创建对象时方法写错了,所以容器并没有发现有localeResolver ,所以走的是默认配置,下面我们进行更改

springboot 使用国际话自定义localeResolver 不生效

重新启动,点击切换ok...................所以遇到问题时当不知道问题出在哪时,排查错误首先把自己确认的问题先验证了,比如这个问题我在处理时首先想到有没有请求成功,,有没有国际化配置错误,然后使用简单验证方法,页面切换本地语言,然后查看源码追踪,问题慢慢找到。