在 Liferay 5.2.x 中,我试图获取执行了触发 ExpandoValue
实例/记录更改的操作的人员的用户或用户 ID。这可能吗?
自定义属性/expando 数据模型由 ExpandoTable
、ExpandoColumn
、ExpandoRow
和 ExpandoValue
表示。 ExpandoValue
似乎没有一个字段来跟踪谁进行了最后的更改。我需要做什么才能添加一个?这是个好主意吗?
或者,我有一个 ExpandoValueListener
模型监听器。不过,模型监听器似乎与任何特定的请求分离,因为监听器方法会“响应”模型中的更改而被触发。 ModelListener
接口(interface)中的方法 header 均不包含任何类型的 Request,甚至不包含 ServiceContext(基于 Request 构建)。
仍然有一种方法可以访问 Request、ServiceContext 或其他一些机制,以便从任何 ModelListener 方法(可能是 onBefore*()
方法之一)中获取当前 UserId?我见过有人建议使用 PrincipalThreadLocal
但有时似乎会返回 null
。
有什么想法吗?我需要只捕获按钮点击吗?我试图避免这种情况,因为它比数据库触发器或模型监听器更困惑且更难维护。
提前致谢!
最佳答案
看起来 Liferay 6 通过添加一个包含 ServiceContext
堆栈的 ServiceContextThreadLocal
类来解决这个问题。另外,BasePersistenceImpl
包含一个
public T update(T model, boolean merge, ServiceContext serviceContext)
推送上下文、触发模型监听器,然后弹出上下文的便捷方法。这个想法是,您现在可以在正在实现的 ModelListener
中从 ServiceContextThreadLocal
获取 ServiceContext
。
我不会尝试在 Liferay 5.2.x 中模仿这一点,因为以这种方式修改持久层超出了我的项目范围。归根结底,我想我只是在单击按钮时从 struts processAction 调用存储过程。
从代码维护和可读性的角度来看,这可能是处理这个问题的最糟糕的方法,但也促成了这个决定,因为我只有三个这样的事件,而且我的时间很短。希望如果我可以升级到 Liferay 6,我可以将它们折叠到 modelListener/serviceContext 中。关于java - 是否可以获取对 ExpandoValue 实例/记录进行更改的用户(或用户 ID)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11546053/