2012-03-28 51 views
1

我們已經在幾個資源包,這是在在faces-config.xml在JSF 2.1 +彈簧避免javax.el.PropertyNotFoundException對資源束查找3

<resource-bundle> 
<base-name>webMessages</base-name> 
<var>feBundle</var> 
</resource-bundle> 

然後我們試圖訪問配置定義的屬性未定義的財產。

<tag infoText="#{feBundle['insurance.comparison.household.details.aicraftCrash.tooltip']}" 

/>

如果屬性是不可用javax.el.PropertyNotFoundException被拋出,並導致臉部servlet來呈現一個空白頁。從ResourceBundleELResolver的文檔中不應該發生,因爲它不會拋出此異常。我可以看到它是DemuxCompositeELResolver的解析器的一部分。但它似乎從未被調用過。而是調用MapELResolver(放置在解析器列表中的RBELResolver之後)並引發異常。我無法真正做出這種行爲,調試很乏味。必須有一些方法來解決這個問題。缺少的屬性不能破壞我整個頁面的渲染過程。有任何想法嗎?

注:這是一個問題只與所提供和Tomcat> 6個分派之javax.el庫

回答

2

我調查的問題遠一點,發現它是由javax.el包的實施造成tomcat發行版。所以描述的行爲只發生在使用tomcat> 6時。我已經在他們的錯誤跟蹤工具中提交了一個錯誤報告,儘管可以爭辯說它不是一個真正的錯誤,而是一種想要的(但是,恕我直言,醜陋的)行爲。我還爲jsf找到了一個解決方案。

子類 ResourceBundleELResolver並覆蓋它的getValue(...)方法。將其更改爲 ,以便在發生任何異常之前將PropertyResolved屬性設置爲true。

if (base instanceof ResourceBundle) { 
     if (property != null) { 
      try { 
       context.setPropertyResolved(true); 
       Object result = ((ResourceBundle) base).getObject(property 
         .toString()); 
       return result; 
      } catch (MissingResourceException mre) { 
       System.out.println("Missing property: " + property); 
       return "?" + property.toString() + "?"; 
      } 
     } 
    } 

註冊在faces-config.xml中這個自定義解析與

<el-resolver>your.package.TheResolverImplementation</el-resolver> 

和鏈接到錯誤報告https://issues.apache.org/bugzilla/show_bug.cgi?id=53001

+0

謝謝!這篇文章節省了我的一天。 – anttix 2012-07-12 01:49:58

+0

很酷。最後,我可以幫助別人在享受這麼多有用的帖子後在stackoverflow上。順便一提。這個bug在當前的tomcat版本中得到解決(開發人員非常好,並立即提出問題) – bennidi 2012-07-27 12:52:08