是否可以获得创建ExpandoValue实例/记录更改的用户(或用户ID)?

时间:2012-07-18 16:28:38

标签: java liferay

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

自定义属性/ expando数据模型由ExpandoTableExpandoColumnExpandoRowExpandoValue表示。 ExpandoValue似乎没有一个字段来跟踪最后一次更改的人。添加一个我需要做什么?这是个好主意吗?

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

仍然有办法访问Request,ServiceContext或其他一些机制来从任何ModelListener方法中获取当前的UserId(可能是onBefore*()方法之一吗?我见过一些人推荐使用PrincipalThreadLocal但有时似乎会返回null

有什么想法吗?我是否只需要点击按钮点击?我试图避免这种情况,因为它比DB触发器或模型监听器更难以维护。

提前致谢!

1 个答案:

答案 0 :(得分:3)

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

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

方便方法,用于推送上下文,触发模型侦听器,然后弹出上下文。我们的想法是,您可以在正在实施的ServiceContext内从ServiceContextThreadLocal获取ModelListener

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

从代码维护和可读性的角度来看,这可能是解决这个问题的最糟糕的方法,但也有助于这个决定的事实是我只有三个这样的事件,而且我的时间很短。希望我可以将这些文件折叠到modelListener / serviceContext中,如果我可以升级到Liferay 6。