搜索这个错误的小伙伴,想来都是看了某spring boot视频吧!
具体错误如下图:
好了,贴上我的项目环境:
springboot:2.2.6
thymeleaf:根据springboot自动选择的版本
Java:1.8
直接上解决办法:
错误情况1:确保国际化文件夹存放在resources下面,如图
i18n是我的国际化文件,不是存放在resources文件夹里面的resources里面;
application.properties写上spring.messages.basename=i18n.login
错误情况2:确保application.properties配置了spring.messages.basename,且配置正确
我的项目结构:
我的application.properties文件配置内容spring.messages.basename=i18n.login
错误情况3:将spring.messages.basename=i18n.login改成spring.messages.basename=i18n/login
当然,我使用的这个spring boot版本,这两种写法都可以识别
ps:看见有人说,html里面取值不用加login,即
<label class="sr-only" th:text="#{login.username}">Username</label>
可写为
<label class="sr-only" th:text="#{username}">Username</label>
自己试了一下,两种写法都没有问题,但是inline方式取值的话还是要加上login.的,不然是会出错的。
如果以上的方法解决了你的问题,那么我很高兴。
接下来看看这个问题出现的原因是什么:
其实就是配置文件中spring.messages.basename配置有误,这个有误呢,包括路径错误,拼写错误(il8n和i18n,我竟然犯了这个错),或者说路径分割符错误,总之就是,他根据你的配置,并没有找到你的文件。当然,要是你注释掉这行配置,也会报同样的错误。
既然知道是什么原因造成的,那么我们做如下几个实验:
分别将i18n放入public、resources、static、templates文件夹里面
然后呢,我们在配置文件里面配置好spring.messages.basename,路径则为public.i18n.login或者其它相应的位置等,然后我们再运行我们的项目,发现都成功了。总而言之,我们将国际化文件放在classpath路径下或它下面的文件夹中,然后再配置好spring.messages.basename,都是可以成功找到的,因为springboot他就是拼接classpath路径和你设置的路径,然后找到相应的文件。(ps:classpath是指哪里呢,maven初始化的项目,它指的是resources,就是包含public、static等文件的那个文件夹,其它详细的建议百度或者看官方文档)。
接下来看看为什么我们在路径中使用.或者/都能成功呢?瞅瞅源码哈!
截取的源码的一部分,其实这里就是将路径中的.给换成了/,这也就是为什么.和/都可以成功的原因。
各位小伙伴们,可能springboot版本不同,他们的实现或者错误都有差别,大家具体情况具体分析哈!如果博文存在错误,请指出,感谢!