1

我需要知道用户何时修改其个人资料中的某些属性。

我做了一个钩子,但是像生日这样的一些字段在 onAfterUpdate 和 onBeforeUpdate 函数中是相同的值。

我不知道如何才能知道用户字段和自定义字段何时更改。我想扩展配置文件,但我不知道如何以及这是否是唯一或最好的解决方案。

这是portal.properties的代码:

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();
    }
}

}

这是输出:

您好 1990 年 2 月 12 日星期一 00:00:00 GMT 之前的更新 1990 年 2 月 12 日星期一 00:00:00 GMT

您好 1990 年 2 月 12 日星期一 00:00:00 GMT 之后的更新 1990 年 2 月 12 日星期一 00:00:00 GMT

谢谢!


我重写 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 中: public class MyUserLocalServiceImpl extends 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 个钩子,它起作用了。

4

1 回答 1

1

并不真正推荐用于属性更改的模型侦听器:它们处于持久性级别,不应包含任何业务逻辑。您应该update*重写UserLocalService. 在那里应该更容易访问所需的bean。

如果您仍然想找到代码无法正常工作的根本原因,一种可能性是检查它们是否相同(例如userUserLocalServiceUtil(user.getId())由于返回的是缓存的 bean 而不是实际的数据库值)。我没有查,但这可能是您看到的行为的原因。

于 2013-09-25T08:20:56.577 回答