使用f:loadBundle时的javax.el.PropertyNotFoundException ...这是否正确实现了规范?

时间:2012-06-14 19:11:05

标签: java jsf tomcat el resourcebundle

我有一个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

后仍然存在同样的问题

1 个答案:

答案 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家伙。