在Liferay 5.2.x中,我试图获取那些触发ExpandoValue
实例/记录更改的人的用户或用户ID。这可能吗?
自定义属性/ expando数据模型由ExpandoTable
,ExpandoColumn
,ExpandoRow
和ExpandoValue
表示。 ExpandoValue
似乎没有一个字段来跟踪最后一次更改的人。添加一个我需要做什么?这是个好主意吗?
或者,我有一个ExpandoValueListener
模型监听器。模型监听器似乎与任何特定的请求脱离,因为监听器方法被“反应性地”触发模型中的更改。 ModelListener
接口中的方法头都不包含任何类型的请求,甚至包含ServiceContext(由请求构建)。
仍然有办法访问Request,ServiceContext或其他一些机制来从任何ModelListener方法中获取当前的UserId(可能是onBefore*()
方法之一吗?我见过一些人推荐使用PrincipalThreadLocal
但有时似乎会返回null
。
有什么想法吗?我是否只需要点击按钮点击?我试图避免这种情况,因为它比DB触发器或模型监听器更难以维护。
提前致谢!
答案 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。