変更不可能なセットを生成するプロデューサー メソッドがあります。
// 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 つの質問があります。
この状況で取るべき最善のアプローチは何でしょうか?
@Inject @LoggedIn Set<Role> roles
警告が発生するのに発生しないのはなぜprivate Set<Role> roles1
ですか?@SuppressWarnings({"NonSerializableFieldInSerializableClass"})
注入ポイントで適用しても警告が抑制されないのはなぜですか?