【问题标题】:Non-serializable attributes in Struts Action classStruts Action 类中的不可序列化属性
【发布时间】: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


【解决方案1】:

EntityManager 应该是persistent dependency,例如:

@PersistenceUnit(unitName = "QueryPersistenceUnit")
private EntityManagerFactory entityManagerFactory;
public EntityManager getEntityManager() {
    return entityManagerFactory.createEntityManager();
}

【讨论】:

  • 谢谢,但我认为这不能解决 Sonar 的可序列化问题。如果我将您的方法创建的 EM 存储为操作类的私有成员,我会得到相同的结果。还是我错了?能详细点吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-22
  • 1970-01-01
  • 1970-01-01
  • 2014-05-16
  • 1970-01-01
相关资源
最近更新 更多