当前位置: 首页 > 知识库问答 >
问题:

我应该在Java EE中将注入的变量声明为瞬态变量吗?

阴高刚
2023-03-14

我应该在Java EE中将注入的变量声明为瞬态变量吗?

我收到FindBugs警告:

类com.playaround.HelloServlet定义了非瞬态非序列化实例字段加速单元
这个序列化类定义了一个非基元实例字段,它既不是瞬态的、序列化的,也不是java.lang.的对象,并且看起来没有实现外部化接口或readObject()和WriteObject()方法。
如果非序列化对象存储在这个字段中,这个类的对象将不会被正确反序列化。

起作用的代码是:

/**
 * Sample of a web service reference.
 */
@WebServiceRef
private AccelerationUnit accelerationUnit;

同样的问题也适用于资源、注入、持久单元等。

共有2个答案

陆城
2023-03-14

在类AccelerationUnit的定义中,将其设置为:

class AccelerationUnit implements Serializable{
    // your code here
  }
戚奇略
2023-03-14

这取决于;)使用@Inject和其他CDI注释,您应该查看JSR-299规范的第6.6章。您已经获得了哪些bean是“能够钝化的”的信息。

关于无状态和单例会话bean,根据EJB规范,它们不能序列化(因为EJB钝化不会发生)

最后,也是最有问题的是有状态会话bean。所有JavaEE资源(EJB、InitialContext、SessionContext等)都将在激活后恢复,但您必须处理其他不可序列化的字段和打开的连接。所以在您的IMHO中,您应该将accelerationUnit标记为transient并在ejbActivate事件中恢复,或者使用CDI和producer方法自动注入字段。

 类似资料:
  • let和const是JavaScript里相对较新的变量声明方式。 像我们之前提到过的,let在很多方面与var是相似的,但是可以帮助大家避免在JavaScript里常见一些问题。 const是对let的一个增强,它能阻止对一个变量再次赋值。 因为TypeScript是JavaScript的超集,所以它本身就支持let和const。 下面我们会详细说明这些新的声明方式以及为什么推荐使用它们来代替v

  • 局部变量使用关键字 def 来声明,其只在声明它的地方可见 . 局部变量是 Groovy 语言的一个基本特性. 例子 13.2 . 使用局部变量 def dest = "dest" task copy(type: Copy) { form "source" into dest }

  • Rust 语言可以先声明变量绑定,后面才将它们初始化。但是这种情况用得很少,因为这样很可能导致使用未 初始的变量。 fn main() { // 声明一个变量绑定 let a_binding; { let x = 2; // 初始化一个绑定 a_binding = x * x; } println!("a bi

  • 问题内容: 我是OOP范式的新手,所以可能对此问题有一个简单的解释… 您是否总是需要在类中声明公共对象范围的变量?例如: 在此代码中,即使是唯一声明的变量,也一样可访问和可用-似乎就像我将其声明为public一样。 如果未声明的类变量始终可以这样访问,那么将它们全部预先声明的意义何在? 问题答案: 该变量不是未初始化的,只是未声明的。 在类定义中声明变量是提高可读性的一种方式。另外,您可以设置可访

  • 问题内容: 我不明白这个脚本有什么问题 我希望它在表中插入10个值,但是第二行有错误。 问题答案: MySQL不支持执行存储过程代码的匿名块。 您需要创建一个包含该代码的存储过程,然后调用它。 另外,您在插入语句的末尾缺少分号。我修好了 您可能还想使用concat()而不是+来生成名称,但是我将把更改留给您。 创建过程: 调用过程:

  • 主要内容:类型断言(Type Assertion),类型推断,变量作用域变量是一种使用方便的占位符,用于引用计算机内存地址。 我们可以把变量看做存储数据的容器。 TypeScript 变量的命名规则: 变量名称可以包含数字和字母。 除了下划线 _ 和美元 $ 符号外,不能包含其他特殊字符,包括空格。 变量名不能以数字开头。 变量使用前必须先声明,我们可以使用 var 来声明变量。 我们可以使用以下四种方式来声明变量: 声明变量的类型及初始值: 例如: 声明变量的类型,