2009-12-20 48 views

回答

2

沒有人對此負責。這只是EL負責的。如果表達式#{beanname}返回null,它將創建一個與託管bean名稱相關聯的表達式。

在您的具體情況下,解決此問題的常規方法是使用bean的構造函數或使用註釋爲@PostConstruct的bean的公共方法。

public class Bean { 

    public Bean() { 
     // Put code here which is to be executed during construction, but before  
     // setting of the managed properties (<managed-property> declarations). 
    } 

    @PostConstruct 
    public void init() { 
     // Put code here which is to be executed AFTER construction 
     // and the setting of managed properties. 
    } 

} 

如果你真的想採取EL在你自己的手中解決,那麼最好你可以做的是實現一個自定義ELResolver。你可以找到here這篇文章。

1

這是在JSF 1.2規範詳細介紹了JSP解析器結構:

Faces ELResolver for JSP 
|_ faces.ImplicitObjectELResolverForJSP 
|_ faces.ManagedBeanELResolver 
|_ faces.ResourceBundleELResolver 
|_ ELResolvers in application configuration resources 
|_ faces.VariableResolverChainWrapper (wraps deprecated API) 
|_ faces.PropertyResolverChainWrapper (wraps deprecated API) 
|_ ELResolvers from Application.addELResolver() 

託管bean將由faces.ManagedBeanELResolver被實例化(這僅僅是一個標籤,開發者可以通過引用它,一個沒有名字公共課)。

頂級ELResolver通過Application(您可以通過ApplicationFactory提供)提供。但是,儘管JSF規範詳細描述了行爲,但API並未公開受管理bean將被實例化的方式。要裝飾實現來消除新實例化的bean與從請求/會話/應用程序作用域返回的bean之間的歧義是很困難的。

BalusC's post爲解決這個問題提供了一些很好的策略。

雖然JSF 2.0給託管bean設施帶來了變化,但據我所知,它並沒有改變API的這個方面。

1

@PostConstruct是JSF 1.2的發展方向。 如果您使用的是JavaEE 6,那麼您也可以在方法上使用@Produces註釋來創建自定義工廠方法。

​​