Serialization 需要能够@Inject Serializable Set到@SessionScoped bean中

Serialization 需要能够@Inject Serializable Set到@SessionScoped bean中,serialization,cdi,suppress-warnings,Serialization,Cdi,Suppress Warnings,我有一个producer方法,它希望生成一个不可修改的集合: // 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

我有一个producer方法,它希望生成一个不可修改的集合:

// 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);
}
奇怪

我有三个问题:

  • 在这种情况下,最好的方法是什么

  • 为什么
    @Inject@LoggedIn Set roles
    会导致警告,而
    private Set roles1
    不会

  • 为什么在注入点应用
    @SuppressWarnings({“NonSerializableFieldInSerializableClass”})
    不会抑制警告


  • 只有第一行是注入点,因此CDI将扫描它并确保它可以被注入。CDI不会扫描第二行以确保它是可注入的,因为CDI不会尝试将其注入

    SuppressWarnings
    是编译时注释,而不是运行时注释。它在编译类中丢失了


    您可以创建一个实现serializable的
    实现并使用它。它应该像设置impl一样注入。

    只有第一行是注入点,因此CDI将扫描它并确保它可以被注入。CDI不会扫描第二行以确保它是可注入的,因为CDI不会尝试将其注入

    SuppressWarnings
    是编译时注释,而不是运行时注释。它在编译类中丢失了


    您可以创建一个实现serializable的
    实现并使用它。它应该像set impl.

    Oh那样被注入,所以这是一个关于注入的警告(特别是,对象不能被注入,因为它不可序列化),而不是我有时收到的关于可序列化类中不可序列化字段的另一个警告。这两个警告听起来很相似,这让我很困惑。奇怪的是,Intellij没有警告不可注入集,即使我的项目默认检查包括“可序列化类中的非序列化字段”检查。我应该收到两个不同的警告,每行一个。我查看了“可序列化类中的不可序列化字段”检查的描述,它说,“为了进行此检查,假设具有java.util.Collection或java.util.Map类型的字段是可序列化的,除非它们声明包含的类型是不可序列化的。”这可以解释为什么我没有收到第二个警告。哦,这是关于注入的警告(特别是,无法注入对象,因为它不可序列化)而不是我有时收到的关于可序列化类中不可序列化字段的另一个警告。这两个警告听起来很相似,这让我感到困惑。奇怪的是Intellij没有警告不可注入集,即使我的项目默认检查包括“可序列化类中的不可序列化字段”“检查。我应该收到两个不同的警告,每行一个。我查看了“可序列化类中的不可序列化字段”检查的描述,它说,“为了进行此检查,假设具有java.util.Collection或java.util.Map类型的字段是可序列化的,除非它们声明包含的类型是不可序列化的。”这将解释为什么我没有收到第二个警告。
    @Inject @LoggedIn Set<Role> roles;
    
    @Inject @LoggedIn Set<Role> roles;  // warning
    private Set<Role> roles1;           // no warning!