1

変更不可能なセットを生成するプロデューサー メソッドがあります。

// EnumSet.noneof returns an object of type Serializable, and also
// Collections#synchronizedSet javadoc says, "The returned set will be 
// serializable if the specified set is serializable."
private final Set<Role> roles =
      Collections.synchronizedSet(EnumSet.noneOf(Role.class));

...

@Produces @LoggedIn public Set<Role> getRoles()
{
    // Collections#unmodifiableSet javadoc also says, "The returned set will be
    // serializable if the specified set is serializable."
    return Collections.unmodifiableSet(this.roles);
}

セットをセッション スコープ Bean に注入したい:

@Inject @LoggedIn Set<Role> roles;

インジェクション ポイントで、シリアル化できないセットをパッシベーション スコープの Bean にインジェクトでき​​ないという警告が発行されます。Set インターフェイスは Serializable を拡張しないため、この警告は理にかなっています。ただし、この状況では、javadoc によるとroles、実際にはシリアライズ可能であるように見えます。警告を回避するために、この状況を処理する最善の方法がわかりません。

@SuppressWarnings({"NonSerializableFieldInSerializableClass"})ちなみに、注射点に塗布しても警告が抑制されないことに気付きました。しかし、インジェクション ポイントのすぐ隣にある同じセッション スコープ Bean 内の次のコード行によって、警告メッセージが発行されないことにも気付きました。

@Inject @LoggedIn Set<Role> roles;  // warning
private Set<Role> roles1;           // no warning!

変!

3 つの質問があります。

  1. この状況で取るべき最善のアプローチは何でしょうか?

  2. @Inject @LoggedIn Set<Role> roles警告が発生するのに発生しないのはなぜprivate Set<Role> roles1ですか?

  3. @SuppressWarnings({"NonSerializableFieldInSerializableClass"})注入ポイントで適用しても警告が抑制されないのはなぜですか?

4

1 に答える 1

1

最初の行のみが注入ポイントであるため、CDI はそれをスキャンして注入できることを確認します。2 行目は、CDI が注入しようとしていないため、注入可能であることを確認するために CDI によってスキャンされません。

SuppressWarningsランタイムではなく、コンパイル時の注釈です。コンパイルされたクラスでは失われます。

Setserializable を実装する実装を作成し、それを使用できます。そのセットの impl として注入する必要があります。

于 2013-08-12T19:26:40.910 に答える