Java 在servlet'中具有服务层对象;s场

Java 在servlet'中具有服务层对象;s场,java,servlets,jakarta-ee,serializable,transient,Java,Servlets,Jakarta Ee,Serializable,Transient,我目前正在使用Hibernate编写一个J2EE应用程序,并在Tomcat上运行它。该项目分为几个部分(DAO、服务、控制器(servlet)、视图(JSP))。DAO和服务是单例的。为了解耦控制器和服务,我将对服务接口的引用存储为servlet字段。Sonarqube告诉我们,这些字段必须被标记为transient,或者服务类必须实现Serializable,或者这些字段应该被删除。那么,在servlet中包含字段是否不好?如果我只是将它们标记为transient呢?在servlet中声明和使

我目前正在使用Hibernate编写一个J2EE应用程序,并在Tomcat上运行它。该项目分为几个部分(DAO、服务、控制器(servlet)、视图(JSP))。DAO和服务是单例的。为了解耦控制器和服务,我将对服务接口的引用存储为servlet字段。Sonarqube告诉我们,这些字段必须被标记为transient,或者服务类必须实现Serializable,或者这些字段应该被删除。那么,在servlet中包含字段是否不好?如果我只是将它们标记为transient呢?

在servlet中声明和使用变量不是一个好的做法,因为同一个实例在不同的线程之间共享


Servlet状态在某些情况下可能会持久化,具体取决于Web容器。警告的原因是,在这种情况下,容器可能会抛出错误。

在servlet的实例字段中存储对象引用是完全安全的,只要生成的对象图是不可变的或无状态的。如果不是这样,那么您将有并发问题

从技术上讲,这些字段需要对其应用
transient
修饰符,因为某些容器将在受控关闭期间(或方便时的任何其他时间)使用序列化保存servlet的状态。因此,servlet需要实现一个
私有void readObject(java.io.ObjectInputStream in)
抛出IOException、ClassNotFoundException
方法以恢复服务引用字段

有关更多信息,请阅读javadocs