JSF国际化报错:无法找到指定base name的资源包
咱们一步步拆解你遇到的这个资源包找不到的问题,结合你的配置和错误信息,核心问题出在资源包的命名、位置或者潜在的关键字冲突上,下面是具体的排查和修复方案:
1. 先检查资源包的命名和存放路径
JSF对资源包的命名和位置有严格要求,你的faces-config.xml里配置的base-name是com.tfduque.fieldassist.interface,那对应的属性文件必须满足:
- 存放路径:如果是Maven项目,要放在
src/main/resources/com/tfduque/fieldassist/目录下;如果是非Maven的Web项目,要放在WEB-INF/classes/com/tfduque/fieldassist/目录下(部署后服务器能读到的类路径里)。 - 命名格式:必须遵循
[baseName]_[locale].properties的规则:- 默认兜底包(找不到对应locale时用):
interface.properties - 英文(en_US):
interface_en_US.properties - 巴西葡萄牙语:
interface_pt_BR.properties - 西班牙语:
interface_es.properties
- 默认兜底包(找不到对应locale时用):
从你的错误信息Can't find bundle for base name com.tfduque.fieldassist.interface_es, locale pt_BR来看,系统在处理pt_BR locale时,错误地尝试加载es的资源包,这大概率是因为你缺少interface_pt_BR.properties文件,或者文件命名/路径有误导致系统回退时也找不到对应资源。
2. 别用Java关键字当资源包名称
interface是Java的保留关键字,虽然JSF不会直接报错,但类加载器可能会出现一些奇怪的兼容问题,建议你把base-name改成非关键字,比如:
<resource-bundle> <base-name>com.tfduque.fieldassist.i18n.messages</base-name> <var>msg</var> </resource-bundle>
然后把对应的资源包文件改成messages.properties、messages_en_US.properties等,放在com/tfduque/fieldassist/i18n/目录下,这样更稳妥。
3. 核对faces-config的配置细节
你的locale配置看起来没问题,但要再确认:
- 你注释掉的
message-bundle不会影响当前配置,这部分没问题 resource-bundle的base-name拼写完全正确,注意Java的包名和文件名是大小写敏感的,别出现大小写不一致的情况
4. 确认资源包被正确打包到项目里
部署项目后,去服务器的部署目录(比如Tomcat的webapps/你的项目名/WEB-INF/classes/com/tfduque/fieldassist/)看看,所有的.properties文件是不是都在那里。如果文件没出现,说明编译或打包时没把资源文件包含进去,比如Maven项目要确保src/main/resources在pom.xml里被配置为资源目录。
5. 关于资源包的位置
资源包不需要放在根目录,只要和base-name对应的包路径一致就可以,你现在的路径配置思路是对的,不是位置的问题。
小技巧:先测试默认资源包
如果一时找不到问题,可以先只保留默认的interface.properties文件,暂时把supported-locale都注释掉,只留default-locale,测试能不能正常加载默认资源。如果可以,再逐步添加其他locale的资源包,这样能快速定位是哪个文件出了问题。
内容的提问来源于stack exchange,提问作者Tiago Duque

