2015-06-09 33 views
0

對於一個項目,我們正在將一些Java應用程序遷移到WebSphere 8.5。在這個過程中,我們試圖擺脫一些遺留的框架。其中之一是shaleapache attic)。從頁面使用的唯一組件是視圖控制器來爲每個頁面實例化一個請求作用域jsf託管bean。每個bean都有一個在頁面加載時調用的init方法。我想在這個方法上使用@PostConstruct。我唯一的問題是bean在bean上的方法被調用時被實例化。不幸的是,bean並不總是被調用,並且init方法會在會話作用域bean上填充數據。有一個鏈接頁面和bean的命名約定,所以我們可以使用一個監聽器根據請求實例化bean。另一種解決方案可能是將範圍更改爲viewscope(可能在websphere 8.5上很麻煩)。如何在頁面加載時實例化輔助bean

我想知道是否有什麼我可以做的PostConstruct工作?還有其他的選擇我錯過了嗎?

編輯: 我有一個PhaseListener來執行基本功能。它將請求的頁面與相應的bean相匹配(通過命名約定)。以下是用來實例化bean,但看起來有點難看。

expressionFactory.createValueExpression(elContext, "#{" + managedBeanName + "}", Object.class) 

有沒有更好的方法來做到這一點?

+0

哪個JSF 2.x版? WAS 8.5自己的MyFaces 2.0.x? – BalusC

+0

優選地,改變實現將需要改變類加載器順序(父最後)。我不認爲這是我們的選擇。 – pjanssen

+0

我沒問過。我問你正在使用哪個JSF 2.x版本。然後,我可以針對我的答案。實際上可能依靠JSF 2.x版本來使用。那麼,你再一次使用JSF 2.0,2.1或2.2嗎? – BalusC

回答

2

也許你可以嘗試使用<f:event/>

在您看來,您可以將其添加到頁面。

<f:event type="postAddToView" listener="#{backingBean.myInitMethod()"/> 

https://stackoverflow.com/a/14004230/4706826

給你時,你得到執行的事件的信息。

+0

謝謝,這可能是一個選項。這將需要很多腿部工作,但我會研究它。 – pjanssen

-2

將一個@PostConstruct註釋的方法放在backing bean中。這個註解告訴bean在每次調用它的構造函數時執行帶註釋的方法。

例子:

@ManagedBean 
@ViewScoped 
public class MyManagedBean{ 

    @PostConstruct 
    public void initView() throws Exception{ 
     ...initialize page values, execute database queries, etc. 
    } 
+0

嘗試從頂部到底部閱讀問題,而不是隻閱讀標題。 – BalusC

相關問題