java - 是否可以获取对 ExpandoValue 实例/记录进行更改的用户(或用户 ID)?

标签 java liferay

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

自定义属性/expando 数据模型由 ExpandoTableExpandoColumnExpandoRowExpandoValue 表示。 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/

相关文章:

java - 让 TextView 和 EditText 在选择单选按钮时出现?

java - 数据库列大小约束的文本区域最大长度问题

liferay - 如何在以编程方式创建时向期刊文章添加结构和模板

liferay - 如何以编程方式获取文档库内容的下载 url

database - 使用 Liferay 配置自定义数据库

java - 第三次调用服务器无法从登录中找到 cookie(使用 Codenameone)

java - 为什么我在创建新的 Android 项目时遇到渲染错误?

java - 以任意顺序接受用户的任意数据类型(int、float、string)

parameters - Liferay portlet 参数传递给不同的 portlet

Liferay - 在 javascript 中获取本地化名称