【发布时间】:2020-10-13 10:02:00
【问题描述】:
我正在根据 Sonar 和 Kiuwan 分析器的建议重构我们的代码。我们的架构是基于 Struts 2.x 框架的标准 MVC Java Web App,部署在 Apache Tomcat 9.x 上。 App 本身基本上是一个信息系统,允许用户浏览 pdf 文档并对其执行操作。
我遇到了一个设计缺陷,我不知道如何解决,或者它甚至是一个问题。
在处理 http 请求期间,我们在调用 Struts Actions 之前在 Interceptor 类中设置了 Hibernate 的 Entity Manager 实例。我们将这个 EM 实例用于 Struts 操作的整个生命周期。当动作完成时,拦截器关闭 EM 实例。 EM 实例作为类属性保存到动作类的实例中。片段如下。
class BaseAction extends ActionSupport implements EntityManagerAware { //EntityManagerAware my interface that allows interceptor to inject em instance into underlying Action class
private EntityManager em;
private String someParam;
@Action(value = "welcome", results = {@Result(name = SUCCESS, type = "tiles", location = "welcome")})
public String input() {
em.doStuffWithEntities();
log.trace("Some param": + someParam);
return SUCCESS;
}
...
}
我一直认为这个解决方案是可以的,但现在我们介绍了声纳。 Sonar 将 em 属性标记为 - 使“em”瞬态或可序列化。我了解 Sonar 认为它是可能在 HttpRequests 期间传递的属性,在上面的 sn-p 中行 someParam 属性。
我的问题是 Struts 动作属性是否需要可序列化(即使是像“em”这样的属性)?我可以通过 Struts 注释或仅使用瞬态标志以某种方式解决这个问题吗? Action类实例的序列化何时发生?会发生吗?
基本上有人可以更详细地解释这一点(我总是可以将此声纳问题标记为误报,但我真的不知道这是如何工作的)?我用谷歌搜索和搜索,但空手而归。
非常感谢,
吉日
【问题讨论】:
-
你只用它来保存你的数据。更多详情见this答案
标签: java session serialization struts2 action