我想在教程http://www.codeyouneed.com/liferay-custom-notifications/之后使用liferay通知功能。和之前的许多人一样,我成功地增加了通知的数量,但是没有显示通知消息。
我尝试通过添加日志输出来检查getBody
的方法(getLink
,UserNotificationHandler
,...)是否被调用,并且它们根本没有被调用,甚至没有被调用调用UserNotificationHandler
的构造函数。
所以我得出结论,我的通知被写入数据库,但找不到我的UserNotificationHandler
类。
在我的项目中,我已经把 用户通知定义到
project/src/main/resources.
他们看起来像:
<?xml version="1.0"?>
<!DOCTYPE user-notification-definitions PUBLIC "-//Liferay//DTD User Notification Definitions 6.2.0//EN" "http://www.liferay.com/dtd/liferay-user-notification-definitions_6_2_0.dtd">
<user-notification-definitions>
<definition>
<notification-type>${com.myproject.portal.notifications.UserNotificationHandler.PORTLET_ID}</notification-type>
<description>receive-a-notification-when-triggered</description>
<delivery-type>
<name>email</name>
<type>${com.liferay.portal.model.UserNotificationDeliveryConstants.TYPE_EMAIL}</type>
<default>true</default>
<modifiable>true</modifiable>
</delivery-type>
<delivery-type>
<name>website</name>
<type>${com.liferay.portal.model.UserNotificationDeliveryConstants.TYPE_WEBSITE}</type>
<default>true</default>
<modifiable>true</modifiable>
</delivery-type>
</definition>
</user-notification-definitions>
liferay-portlet.xml
位于
project/src/main/webapp/WEB-INF.
中的
UserNotificationHandler
project/src/main/java/com/myproject/portal/notifications
包com.myproject.portal.notifications
中的。
我在liferay-portlet.xml
:
<portlet-name>example</portlet-name>
<icon>/icon.png</icon>
<user-notification-definitions>
user-notification-definitions.xml
</user-notification-definitions>
<user-notification-handler-class>
com.myproject.portal.notifications.UserNotificationHandler
</user-notification-handler-class>
</portlet>
这是我的UserNotificationHandlerClass(到目前为止,我只是想在添加实际内容之前让它工作):
package com.myproject.portal.notifications;
import ...//all necessary imports
public class UserNotificationHandler extends
BaseUserNotificationHandler {
public static final String PORTLET_ID = "example_WAR_myprojectportlet";
private static final Logger log = Logger.getLogger(UserNotificationHandler.class);
public UserNotificationHandler() {
log.info("UserNotificationHandler - Constructor");
setPortletId(UserNotificationHandler.PORTLET_ID);
}
@Override
protected String getBody(UserNotificationEvent userNotificationEvent,
ServiceContext serviceContext) throws Exception {
log.info("in getBody");
return "";
}
@Override
protected String getLink(UserNotificationEvent userNotificationEvent,
ServiceContext serviceContext) throws Exception {
log.info("in getLink");
return "";
}
protected String getBodyTemplate() throws Exception {
log.info("in getBodyTemplate");
return "";
}
}
我在我的portlet中触发通知,如下所示:
ServiceContext serviceContext = ServiceContextFactory.getInstance(request);
JSONObject payloadJSON = JSONFactoryUtil.createJSONObject();
payloadJSON.put("userId", userId);
payloadJSON.put("yourCustomEntityId", 12345);
payloadJSON.put("additionalData", "success");
UserNotificationEventLocalServiceUtil.addUserNotificationEvent(userId,
UserNotificationHandler.PORTLET_ID,
(new Date()).getTime(),
userId,
payloadJSON.toString(),
false,
serviceContext);
这是什么问题?
答案 0 :(得分:0)
你的代码中确实有public static final String PORTLET_ID = "myportlet";
吗?如果是这样,请注意您链接的教程中的额外信息:
NB重要信息:用作通知类型的com.example.notifications.ExampleUserNotificationHandler.PORTLET_ID字符串必须与实际的portlet ID匹配。它实际上并不需要是您的portlet ID,但这是正确的。原因是通知显示portlet使用它来显示通知旁边的小portlet图标,以帮助用户识别通知源。提供错误的Portlet ID或类似null的东西会导致JSP中难以跟踪的NullPointerException。花了一个小时跟踪它。
很可能portlet ID看起来更像"example_WAR_myportlet"
,这表明它部署在名为example.war
的插件中,而portlet id(在portlet.xml中)是myportlet
。尝试它是否有效 - Liferay可能需要找到portlet才能找到,实例化并使用它的NotificationHandler。 (注意:目前这是一个猜测 - 我没有尝试发布的完整代码)