2

在 Liferay 5.2.x 中,我试图获取触发ExpandoValue实例/记录更改的用户或用户 ID。这可能吗?

自定义属性/扩展数据模型由ExpandoTableExpandoColumnExpandoRow和表示ExpandoValueExpandoValue似乎没有字段来跟踪谁进行了最后一次更改。我需要做什么才能添加一个?这是一个好主意吗?

或者,我有一个ExpandoValueListener模型监听器。不过,模型侦听器似乎与任何特定请求分离,因为侦听器方法会“响应地”触发模型中的更改。接口中的任何方法标头都不ModelListener包含任何类型的请求,甚至不包含 ServiceContext(由请求构建)。

尽管如此,有没有一种方法可以访问请求、ServiceContext 或其他一些机制来从任何 ModelListener 方法(可能是其中一种方法)中获取当前的 UserId onBefore*()?我见过有人推荐使用PrincipalThreadLocal,但有时似乎会返回null

有任何想法吗?我是否需要只捕获按钮单击?我试图避免这种情况,因为它比数据库触发器或模型侦听器更混乱且更难维护。

提前致谢!

4

1 回答 1

3

看起来 Liferay 6 通过添加一个ServiceContextThreadLocal包含一堆ServiceContexts 的类来解决这个问题。此外,还BasePersistenceImpl包含一个

public T update(T model, boolean merge, ServiceContext serviceContext)

推送上下文,触发模型侦听器,然后弹出上下文的便捷方法。这个想法是,您可以ServiceContextServiceContextThreadLocal现在开始,在ModelListener正在实施的过程中获得。

我不会尝试在 Liferay 5.2.x 中模仿这一点,因为以这种方式修改持久层超出了我的项目范围。归根结底,我想我只是在单击按钮时从 struts processAction 调用存储过程。

从代码维护和可读性的角度来看,这可能是处理这个问题的最糟糕的方式,但也促成了这个决定的事实是我只有三个这样的事件,而且我的时间很短。希望当我可以升级到 Liferay 6 时,我可以将它们折叠到 modelListener / serviceContext 中。

于 2012-07-18T20:05:22.070 回答