Liferay 7:使用javascript api jsonws检索自定义字段值,返回java.lang.NullPointerException

时间:2019-01-03 03:20:15

标签: javascript node.js reactjs liferay

我对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);
  }
);

工作正常。但是,它仅采用默认值,而不采用为该特定页面分配的值。

1 个答案:

答案 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

这让我想知道您要在这里实现什么-您是在寻找用户特定的字段(然后是用户的自定义字段)还是真正的页面特定的字段?无论如何-由于这是答案,而不是评论,它可能会提供足够的提示来尝试并更接近解决方案。