Как узнать об изменениях профиля в Liferay?

Мне нужно знать, когда пользователи изменяют какой-либо атрибут в своем профиле.

Я сделал хук, но некоторые поля, такие как день рождения, имеют одинаковое значение в функциях onAfterUpdate и onBeforeUpdate.

Я не знаю, как я могу это сделать, чтобы узнать, когда изменились пользовательские поля и настраиваемые поля. Я думал расширить профиль, но я не знаю, как и является ли это единственным или лучшим решением.

Это код портала.свойства:

value.object.listener.com.liferay.portal.model.User=com.rulessegmentation.hook.profile.CreateAccountHook

А это код хука:

public void onAfterUpdate(User user) throws ModelListenerException {
    System.out.println("Hello UPDATE After");
    try {
        System.out.println(UserLocalServiceUtil.getUser(user.getUserId()).getBirthday());
        System.out.println(user.getBirthday());
    } catch (PortalException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SystemException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

public void onBeforeUpdate(User user) throws ModelListenerException {
    System.out.println("Hello UPDATE Before");
    try {
        System.out.println(UserLocalServiceUtil.getUser(user.getUserId()).getBirthday());
        System.out.println(user.getBirthday());
    } catch (PortalException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SystemException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}

И это вывод:

Здравствуйте, ОБНОВЛЕНИЕ до понедельника, 12 февраля, 00:00:00 по Гринвичу 1990 года, понедельник, 12 февраля, 00:00:00 по Гринвичу 1990 года.

Здравствуйте, ОБНОВЛЕНИЕ После понедельника, 12 февраля, 00:00:00 по Гринвичу 1990 года, понедельник, 12 февраля, 00:00:00 по Гринвичу 1990 года.

Спасибо!


Я переопределяю UserLocalService, чтобы знать атрибуты, которые изменяются, и то же самое для AddressLocalService. И это работает, но я не знаю, правильно ли я сделал, потому что другой хук теперь не работает. Я сделал хук и в файле liferay-hook.xml прописал это:

<hook>
    <service>
         <service-type>com.liferay.portal.service.UserLocalService</service-type>          
         <service-impl>com.segmentationProjecthookUpdate.hook.MyUserLocalServiceImpl</service-impl>
    </service>
    <service>
        <service-type>com.liferay.portal.service.AddressLocalService</service-type>
        <service-impl>com.segmentationProjecthookUpdate.hook.MyAddressLocalServiceImpl</service-impl>
    </service>
</hook>

И в MyUserLocalServiceImpl.java: открытый класс MyUserLocalServiceImpl расширяет UserLocalServiceWrapper {

public MyUserLocalServiceImpl(UserLocalService userLocalService) {
    super(userLocalService);
    // TODO Auto-generated constructor stub
}
    public User updateUser(long userId, String oldPassword, String newPassword1, String newPassword2, boolean passwordReset, String reminderQueryQuestion, String reminderQueryAnswer, String screenName, String emailAddress, long facebookId, String openId, String languageId, String timeZoneId, String greeting, String comments, String firstName, String middleName, String lastName, int prefixId, int suffixId, boolean male, int birthdayMonth, int birthdayDay, int birthdayYear, String smsSn, String aimSn, String facebookSn, String icqSn, String jabberSn, String msnSn, String mySpaceSn, String skypeSn, String twitterSn, String ymSn, String jobTitle, long[] groupIds, long[] organizationIds, long[] roleIds, List<UserGroupRole> userGroupRoles, long[] userGroupIds, ServiceContext serviceContext) {
    System.out.println("UPDATE USER");
    return getWrappedService().updateUser(userId, oldPassword, newPassword1, newPassword2,passwordReset, reminderQueryQuestion, reminderQueryAnswer,screenName, emailAddress, facebookId, openId, languageId,timeZoneId, greeting, comments, firstName, middleName, lastName,prefixId, suffixId, male, birthdayMonth, birthdayDay, birthdayYear,            smsSn, aimSn, facebookSn, icqSn, jabberSn, msnSn, mySpaceSn,skypeSn, twitterSn, ymSn, jobTitle, groupIds, organizationIds,roleIds, userGroupRoles, userGroupIds, serviceContext);
    }
}

Это работает, но другой хук, который у меня есть для входа в систему, не работает.

Спасибо.


Я присоединил 2 крючка, и это работает.


person sandra    schedule 25.09.2013    source источник


Ответы (1)


Прослушиватели моделей для изменений атрибутов на самом деле не рекомендуются: они находятся на уровне постоянства и не должны содержать никакой бизнес-логики. Вам лучше переопределить различные методы update* в UserLocalService< /а>. Там должно быть проще получить доступ к необходимым компонентам.

Если вы, тем не менее, хотите добраться до основной причины того, что ваш код не работает, одна из возможностей — проверить, идентичны ли user и UserLocalServiceUtil(user.getId()) (например, из-за того, что вместо фактических значений базы данных возвращается кэшированный bean-компонент). Я не смотрел, но это может быть причиной поведения, которое вы видите.

person Olaf Kock    schedule 25.09.2013
comment
Спасибо! Это работает, но, например, адреса я не могу сравнить, потому что если я это сделаю: User oldUser = UserLocalServiceUtil.getUser(userId); System.out.println(oldUser.getAddresses()); Дополнительный пользователь = getWrappedService().updateUser(...); System.out.println(aux.getAddresses()); Выход такой же. Адреса изменены. Как я могу это сделать? Спасибо. - person sandra; 25.09.2013
comment
трудно увидеть, что вы делаете в комментарии, без форматирования. Вы можете отредактировать свой вопрос? - person Olaf Kock; 25.09.2013