我有一个f:loadBundle,它从我的类路径加载一个属性文件。
<f:loadBundle basename="com.xxx.ui.messages" var="msg" />
稍后,我尝试使用以下语法从资源包中使用消息:
<h:outputText value="test message: #{msg.does_not_exist} --"/>
过去,JSF会打印出“NOT FOUND”消息,但现在它正在抛出异常。规范是否改变或这是正确的行为?
我使用Mojarra 2.1.9和JUEL 2.2.4作为EL解析器。这是堆栈跟踪:
javax.el.PropertyNotFoundException: /WEB-INF/xxx.xhtml @10,70 value="test message: #{msg.does_not_exist} --": Property 'does_not_exist' not found on type java.util.PropertyResourceBundle
at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:111)
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
at javax.faces.component.UIOutput.getValue(UIOutput.java:169)
at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getValue(HtmlBasicInputRenderer.java:205)
at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getCurrentValue(HtmlBasicRenderer.java:355)
at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeEnd(HtmlBasicRenderer.java:164)
编辑: 可以在此处验证正确的行为:http://javaserverfaces.java.net/nonav/docs/2.0/vdldocs/facelets/f/loadBundle.html
(其中说文字符串??? KEY ???从Map返回,其中KEY是在Map中查找的键,而不是抛出的MissingResourceException)
编辑:即使在删除JUEL
后仍然存在同样的问题答案 0 :(得分:3)
所以答案实际上就是盯着你......为了让我开始走上正确的道路而向@millimoose道具。
请注意规范说明:
文字字符串??? KEY ???从地图返回,其中KEY是 在地图中查找的关键字,而不是 MissingResourceException 被抛出。
但我的堆栈跟踪说明了这一点:
javax.el。 PropertyNotFoundException :/ WEB-INF / xxx.xhtml @ 10,70 value =“测试消息:#{msg.does_not_exist} - ”:属性 在类型java.util.PropertyResourceBundle上找不到'does_not_exist'
啊哈,一个可能的错误!
知道这个类是从tomcat / lib中提取的,我浏览了它们的源代码和javadoc here。注意“getValue()”上的throws声明?
这与规范here形成鲜明对比。
所以我从tomcat / lib中删除了el-api并将其替换为spec jar(here)并解决了问题!
为什么Tomcat与规范如此不同超出了我......那些疯狂的Apache家伙。