2016-10-13 6 views
1

私は現在、Hibernateを使用してJ2EEアプリケーションを作成しており、Tomcat上で実行しています。プロジェクトはいくつかのセクション(DAO、サービス、コントローラ(サーブレット)、ビュー(JSP))に分かれています。 DAOとサービスはシングルトンです。コントローラとサービスを切り離すために、私はサーブレットのフィールドとしてサービスインタフェースへの参照を格納します。 Sonarqubeは、これらのフィールドを一時的にマークする必要があること、またはサービスクラスでSerializableを実装する必要があること、またはこれらのフィールドを削除する必要があることを示します。だから、サーブレットにフィールドを持つことは悪いですか?私はそれらを一時的にマークするだけですか?サーブレットのフィールドにサービス層オブジェクトがある

答えて

1

サーブレットのインスタンスフィールドに、結果のオブジェクトグラフが不変またはステートレスである限り、オブジェクト参照を格納することは完全に安全です。これが当てはまらない場合は、並行性の問題が発生します。

技術的には、シリアライズを使用して制御されたシャットダウン(または都合のいいとき)中にいくつかのコンテナがサーブレットの状態を保存するため、これらのフィールドにはtransient修飾子を適用する必要があります。その結果、サーブレットはサービス参照フィールドを復活させるためにprivate void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundExceptionメソッドを実装する必要があります。

詳細については、java.io.Serializable javadocsを参照してください。

1

同じインスタンスが異なるスレッド間で共有されているため、サーブレットで変数を宣言して使用することはお勧めできません。

Webコンテナによっては、サーブレットの状態が永続化することがあります。このようなシナリオでは、コンテナによってスローされるエラーが存在する可能性があるという警告が表示されます。

関連する問題