国际化解析异常:消息无法找到及EL表达式解析失败
兄弟,先别慌,我看你这问题里首先有个明显的EL表达式语法错误——你写的#{msg.['title.index']}是不对的!正确的写法应该是#{msg['title.index']}(去掉点号,直接用括号包裹键名);如果你的资源键是title_index(用下划线替代点号),那才能用#{msg.title_index}的点语法。Eclipse能自动补全只是因为它识别到了你的资源包配置,但语法错误会直接导致运行时解析失败,这是第一个要修正的地方。
接下来咱们一步步排查其他可能的问题:
检查资源包的faces-config.xml配置
确保你的faces-config.xml里的resource-bundle配置完全正确,比如:<application> <resource-bundle> <base-name>com.yourpackage.messages</base-name> <!-- 对应资源文件的类路径路径 --> <var>msg</var> <!-- 这个var要和你页面里用的一致 --> </resource-bundle> </application>注意
base-name是资源文件的完整类路径,比如你的资源文件放在src/main/resources/com/yourpackage/messages.properties,那base-name就是com.yourpackage.messages,不要带.properties后缀。确认资源文件的位置与命名
- 资源文件必须放在类路径下,比如Maven项目的
src/main/resources目录,或者Web项目的WEB-INF/classes目录,编译后要能在项目的classpath里找到。 - 资源文件命名要符合规范:默认文件是
messages.properties,对应其他语言的比如messages_pt_BR.properties(葡萄牙语巴西),确保键名title.index在对应的资源文件里完全存在,注意大小写敏感!
- 资源文件必须放在类路径下,比如Maven项目的
检查页面的JSF命名空间
确保你的xhtml页面顶部引入了正确的JSF命名空间,比如:<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core">没有正确的命名空间,容器可能无法正确解析页面中的EL表达式和JSF标签,进而抛出解析错误。
验证资源包加载是否正常
你可以写个简单的测试代码,在后台Bean里手动加载资源包,看看能不能获取到title.index的值:FacesContext context = FacesContext.getCurrentInstance(); ResourceBundle bundle = context.getApplication().getResourceBundle(context, "msg"); String title = bundle.getString("title.index"); System.out.println(title);如果这段代码能正常输出值,说明资源包配置没问题,问题还是出在页面的EL表达式或者页面解析上;如果报错,那就是资源包的路径或命名有问题。
先把EL表达式的语法错误修正,再按照上面的步骤逐一排查,应该就能解决你遇到的xhtml解析错误和消息不存在的问题了。
内容的提问来源于stack exchange,提问作者Tiago Duque

