2012-01-24 12 views
2

私はJSF2とSpring3でwebアプリケーションを開発し、直列化復元に問題があるのです。Spring3デシリアライズ - シングルトン注入

私はそうのように定義されているいくつかのセッションスコープの豆を持っている:

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

も私はそうのように定義されたいくつかのシングルトンを持っている:

@Repository 
public class Repo { 

シングルトンは、この

ようなセッション・ビーンに注入されています
@Resource 
private transient Repo repo; 

私はシリアライズ/ deserialとtransient、私の問題を追加した後、 izationがなくなった。しかし、今私は、依存関係(この場合はrepo)をデシリアライズした後にnullがあるという問題があります。私はこの問題について多くの調査を行い、いくつかの回避策を見つけましたが、私はまだこの問題の最良の解決策が何であるか疑問に思っています。このためクリーンな解決策は

それは、セッション・ビーンでアプリケーションスコープの豆を使用することは非常に一般的なケースであるように私には思わないのですか?私は@Configurableを使って解決策を立てましたが、ロードタイムを作るために必要なものは本当に必要ですか?注入のターゲットはすでにSpring管理されているので、 は2年後に更新

くれENLIGHTしてください..私には意味がありません:あなたは、透過的アプリケーション・scoped-にセッションスコープの豆を注入することができほとんどの場合、良いアイデアではないかもしれません。私はそれに応じて@ScopeにproxyModeを設定しなければなりませんでした。

+0

うわー。 EJB3はこれを透過的に処理します。私は春もそれをやると期待しています。 Java EE 6では、最近あなたがSpringを使用している特別な理由はありますか? – BalusC

+0

@BalusC彼は能力をテストするか、単に彼はSpring MVCの(JEE6MVCのようなものはありません)、またはその他の理由の何百ものを使用しているため、外部ライブラリとの統合モジュールの負荷のためにそれを使用しても良いです。イデオロギーや宗教の議論を開始しないでください。 –

+0

@Peter:Springを使ったことは一度もありませんし、人々がそれを使用しなければならない理由を理解しようとしていたので、私は興味がありました(ちなみにSpring MVCとJSFを矛盾させます)。 – BalusC

答えて

1

applicationContext.getAutowireCapableBeanFactory()を通じてAutowireCapableBeanFactoryを取得して試してみて、逆シリアル化後にあなたの禁止を再構成することができるはずautowireBeanPropertiesautowireBeanconfigureBeanのようないくつかの方法があります。あなたのために最良の方法を選択してください(そのうちの1つは後処理をトリガーします、他は後処理をトリガーします)。

第2の考え方は、Repoをプロキシにラップすることです。 AdminBeanとシリアル化してデシリアライズします。このプロキシは '実際の'一時的な参照を保持する必要があり、非直列化後にnullが返された場合は、アプリケーションコンテキストから参照する必要があります。

私は春の3はautomaticalyなプロキシと豆をラップすることを聞いたが、私はそれを動作させるために管理ことがありません。

+0

** Spring3はプロキシを使って自動的にラップします:**私はどちらかを動作させることができません。かなり一般的なケースであると思われるので、これにはいくつかの "春の魔法"があるべきだと思います –

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を夢中。

関連する問題