使用liferay停靠栏通知

时间:2015-11-20 07:56:52

标签: liferay

我想在教程http://www.codeyouneed.com/liferay-custom-notifications/之后使用liferay通知功能。和之前的许多人一样,我成功地增加了通知的数量,但是没有显示通知消息。

我尝试通过添加日志输出来检查getBody的方法(getLinkUserNotificationHandler,...)是否被调用,并且它们根本没有被调用,甚至没有被调用调用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);

这是什么问题?

1 个答案:

答案 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。 (注意:目前这是一个猜测 - 我没有尝试发布的完整代码)