我有一个生产者方法想要生成一个不可修改的集合:
// 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!
诡异的!
我有三个问题:
在这种情况下,最好的方法是什么?
为什么会
@Inject @LoggedIn Set<Role> roles
引起警告而private Set<Role> roles1
不会?为什么
@SuppressWarnings({"NonSerializableFieldInSerializableClass"})
在注入点应用不会抑制警告?