我有一个生产者方法,它想要生成一个不可修改的集合:
// 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"})
不会抑制警告?
只有第一行是注入点,因此CDI会扫描它并确保它可以被注入。CDI不会扫描第二行以确保它是可注入的,因为CDI并没有试图注入其中
SuppressWarnings
是一个编译时注释,而不是运行时。它在编译的类中丢失了。
您可以创建一个实现可序列化的Set
实现并使用它。它应该作为集合impl注入。