2012-01-24 23 views
2

我正在開發JSF2和Spring3的Web應用程序,並且存在反序列化問題。Spring3反序列化 - 單例注入

我有一個像這樣定義一些會話作用域bean:

@Controller(value = "admin") 
@Scope(value = "session") 
public class AdminBean implements Serializable { 
... 

我也有一些單身定義,像這樣:

@Repository 
public class Repo { 

單身注入會話豆這樣

@Resource 
private transient Repo repo; 

在我加入transient之後,我的序列化/反序列化問題化已消失。但是現在我遇到了反序列化依賴關係(本例中爲repo)爲空的問題。我在這個問題上搜索了很多,發現了一些解決方法,但我仍然想知道這個問題的最佳解決方案是什麼?

在我看來,在會話bean中使用應用程序範圍的bean是一個很常見的情況,是不是有一個乾淨的解決方案呢?我使用@Configurable來解決方案,但是我真的需要一些加載時間編織的東西嗎?注入的目標已經Spring管理的,所以也沒有任何意義,我.. 請微啓我

更新後2年後:您可以透明地注入會話範圍豆成應用scoped-豆(儘管在大多數情況下可能不是個好主意)。我只需在@Scope上相應地設置proxyMode。

+0

哇。 EJB3透明地處理它。我希望Spring也能做到這一點。是否有你使用Spring,這些天什麼特別的原因,與Java EE 6? – BalusC

+0

@BalusC他可以使用它與外部庫的集成模塊的負載,測試能力或者僅僅因爲他使用了Spring MVC(有沒有像JEE6MVC沒有這樣的事情)或其它數百種原因。不要開始思想或宗教辯論。 –

+0

@Peter:我只是好奇,因爲我從來沒有用過Spring,並試圖理解人們使用它的原因(順便說一句,使用Spring MVC和JSF一起將會是矛盾的)。 – BalusC

回答

1

嘗試獲得AutowireCapableBeanFactory通過applicationContext.getAutowireCapableBeanFactory()也有一些方法,如autowireBeanPropertiesautowireBeanconfigureBean應該能夠反序列化之後重新配置禁令。選擇一種最適合你的方法(其中一個觸發後處理,其他則不等)。

第二個想法是在代理中包裝Repo,這是可序列化的。它會與AdminBean序列化並反序列化。這個代理應該持有'真正的'瞬態引用,如果它在反序列化之後變爲空,它應該從應用程序上下文中查找它。

我聽說Spring 3 automaticaly用這樣的代理包裝bean,但我從來沒有設法使它工作。

+0

** Spring3 automaticaly與代理包裝:**我無法讓它工作,我認爲應該有一些「春天魔術」,因爲它似乎是一個相當普遍的情況 –

0

我面對使用JSF的@ViewScoped其中後臺bean必須序列化這反過來又希望所有的依賴可序列化,這在所有情況下是不可能得到所有類似的問題。正如@Peter提到的有關Spring 3的內容,請看鏈接@ stackoverflow討論相同的here。我用短暫的一些依賴(春季)和反序列化過程中,我迷上豆到

private void writeObject(java.io.ObjectOutputStream stream) and private void readObject(java.io.ObjectInputStream stream)

鑑於範圍的bean和調整他們得到適當的參考。