我对liferay还是很陌生,我已经使用“控制面板>配置>自定义字段>页面”创建了一个页面自定义字段。我的目标是从页面定制字段中检索值,并在我的定制Portlet中显示该值。我尝试过的方法之一是使用liferay json网络服务中的ExpandoValue / get-data API,并且此API是从localhost:8080 / api / jsonws生成的。下面是生成的javascript API:
Liferay.Service(
'/expandovalue/get-data',
{
companyId: themeDisplay.getCompanyId(),
className: 'com.liferay.portal.model.Page',
tableName: 'CUSTOM_FIELDS',
columnNames: 'pageDetail',
classPK: themeDisplay.getUserId()
},
function(obj) {
console.log(obj);
}
);
但是,此api引发了一个错误: java.lang.NullPointerException 。我认为此错误是由于对自定义字段提供的权限而发生的。因此,我已选中Guest的“查看和更新”权限。但是问题仍然存在。
我的问题是什么触发了此错误,以及如何解决该错误,还有其他可用于从页面自定义字段中检索值的解决方案吗?
谢谢。
修改
我在为api分配属性时有误解,这是Olaf建议的新api。
Liferay.Service(
'/expandovalue/get-data',
{
companyId: 20115,
className: 'com.liferay.portal.kernel.model.Layout',
tableName: 'CUSTOM_FIELDS',
columnName: 'details',
classPK: themeDisplay.getLayoutId()
},
function(obj) {
console.log(obj);
}
);
工作正常。但是,它仅采用默认值,而不采用为该特定页面分配的值。
答案 0 :(得分:1)
如果我的记忆正确,那么未经身份验证的用户将无法使用常规远程API,但是至少需要一个已登录用户(当然是在常规权限之外)。
您可以通过从具有相同权限的登录帐户访问API进行测试。如果它在那里工作,那么这就是您遇到的问题。
但是,当我正确解释您的问题的呼叫时,当前用户ID将是您正在查看的自定义字段(查看您的classPK
值)的主键。对于页面上的自定义字段,我希望有一个页面ID(Liferay-API术语中的layoutId)。当我看到此消息时,我在您的代码段中注意到com.liferay.portal.model.Page
。我没有看到该类,而是可以在com.liferay.portal.kernel.model.Layout
中找到页面(假设https://docs.python.org/3/library/typing.html#typing.NamedTuple)
这让我想知道您要在这里实现什么-您是在寻找用户特定的字段(然后是用户的自定义字段)还是真正的页面特定的字段?无论如何-由于这是答案,而不是评论,它可能会提供足够的提示来尝试并更接近解决方案。