3

Spring 管理サービスを使用する JSF Bean に問題があります。JSF Bean で使用される Spring Bean はシリアライズ可能ではないというエラーが表示されました。

@ManagedProperty("#{customerService}")
private CustomerService customerService;

JdbcTemplateそれ自体がシリアル化できないものを使用しているため、サービスをシリアル化できません。さらに、アプリケーション スコープを持つ Spring Bean をシリアル化することはまったく意味がないため、誰かのコードがそれらをシリアル化しようとしている理由がわかりません。

Springのサービスを使ったJSFのプロジェクトで仕事をしたことがありますが、そのような問題はありませんでしたので、そのような連携は可能であるに違いありません。ただ、このプロジェクトはサンプルプロジェクトをもとにゼロから作っているので、Spring-JSF連携の設定に何か問題があるはずなのですが、どこを探せばいいのかわかりません。

Spring for JSF の構成は次のとおりです。

<!-- JSF and Spring are integrated -->
<application>
    <el-resolver>
        org.springframework.web.jsf.el.SpringBeanFacesELResolver
    </el-resolver>
</application>

この問題を解決するには?

4

1 に答える 1

3

JSF シリアライゼーション ミストを回避する方法はありません。ApplicationScoped Bean でさえシリアライズされます (他の Bean に注入される場合)。

しかし、解決策はSpring側で作成されました。スコープ付きプロキシを使用する必要があります。

Bean をシリアライズ可能なプロキシにラップするには、Bean 本体に追加する必要があります。

<aop:scoped-proxy proxy-target-class="true"/>

spring aop 名前空間とspring-aop依存関係を追加する必要があります。

http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd

で、これだ!Bean にはシリアライズ可能な要素があり、デシリアライズ時に Spring コンテキストから Bean を再ロードするプロキシです。

ここでの唯一の誤解は、 cglibクラス レベル プロキシを作成する必要があることです。デシリアライゼーション中にインターフェースが利用できなかったため、JREプロキシが機能していませんでした...理由は完全にはわかりませんが、少なくとも機能するソリューションがあります。

于 2012-12-14T15:05:03.807 に答える