【问题标题】:Liferay changes made to source code through ext plugin are not taking placeLiferay 通过 ext 插件对源代码所做的更改没有发生
【发布时间】:2018-02-08 07:24:22
【问题描述】:

我需要覆盖portalLDAPImporterImpl.java addUser() 方法以在用户从LDAP 导入并添加到Liferay 后执行一些操作。我按照以下步骤(Eclipse 环境):

  1. 已创建 Ext 插件项目名称 customLdap;
  2. docroot/WEB-INF/ext-impl/src 我创建了一个包名 com.liferay.portal.security.ldap
  3. 在那里我创建了我的 CustomPortalLDAPImporterImpl.java 类扩展 portalLDAPImporterImpl.java 并覆盖方法 addUser

代码摘录:

    @Override

    protected User addUser(long companyId, LDAPUser ldapUser, String password)
        throws Exception {

    if (_log.isDebugEnabled()) {
        _log.debug("Adding user " + ldapUser.getEmailAddress());
    }

    boolean autoPassword = ldapUser.isAutoPassword();

    if (!PropsValues.LDAP_IMPORT_USER_PASSWORD_ENABLED) {
        autoPassword = PropsValues.LDAP_IMPORT_USER_PASSWORD_AUTOGENERATED
                && !PropsValues.AUTH_PIPELINE_ENABLE_LIFERAY_CHECK;

        if (!autoPassword) {
            String defaultPassword = PropsValues.LDAP_IMPORT_USER_PASSWORD_DEFAULT;

            if (StringUtil.equalsIgnoreCase(defaultPassword,
                    _USER_PASSWORD_SCREEN_NAME)) {

                defaultPassword = ldapUser.getScreenName();
            }

            password = defaultPassword;
        }
    }

    Calendar birthdayCal = CalendarFactoryUtil.getCalendar();

    birthdayCal.setTime(ldapUser.getBirthday());

    int birthdayMonth = birthdayCal.get(Calendar.MONTH);
    int birthdayDay = birthdayCal.get(Calendar.DAY_OF_MONTH);
    int birthdayYear = birthdayCal.get(Calendar.YEAR);

    User user = UserLocalServiceUtil.addUser(ldapUser.getCreatorUserId(),
            companyId, autoPassword, password, password,
            ldapUser.isAutoScreenName(), ldapUser.getScreenName(),
            ldapUser.getEmailAddress(), 0, StringPool.BLANK,
            ldapUser.getLocale(), ldapUser.getFirstName(),
            ldapUser.getMiddleName(), ldapUser.getLastName(), 0, 0,
            ldapUser.isMale(), birthdayMonth, birthdayDay, birthdayYear,
            StringPool.BLANK, ldapUser.getGroupIds(),
            ldapUser.getOrganizationIds(), ldapUser.getRoleIds(),
            ldapUser.getUserGroupIds(), ldapUser.isSendEmail(),
            ldapUser.getServiceContext());
    _log.info("-----------------------------------------User||||Added----------------------------------------");

    if (ldapUser.isUpdatePortrait()) {
        byte[] portraitBytes = ldapUser.getPortraitBytes();

        if (ArrayUtil.isNotEmpty(portraitBytes)) {
            user = UserLocalServiceUtil.updatePortrait(user.getUserId(),
                    portraitBytes);
        }
    }

    return user;
}
  1. docroot/WEB-INF/ext-impl/src

  2. 中创建文件夹名称 META-INF
  3. META-INF 中创建了一个名为 ext-spring.xml 的文件,代码如下:

  1. 构建并发布我的插件
  2. 从 dist 文件夹复制 customLdap-ext.war 文件并将其粘贴到我的 Tomcat 部署文件夹中
  3. 启动我的服务器,加载旧配置,从 ldap 导入新用户时不打印日志

我在哪里做错了?

注意:我使用的是 liferay 6.2.0.1 CE-GA6

【问题讨论】:

  • 6.2.0.1 CE-GA6?你从哪里得到的 - 从原始来源它不存在。 6.2.5 是匹配“GA6”的版本,6.2.0 是 GA1。我从没听说过 6.2.0.1

标签: java ldap liferay liferay-6


【解决方案1】:

我还覆盖了PortalLDAPImporterImpl.java。您不必定义 ext-spring.xml。就拿原来的类,把它复制到包com.liferay.portal.security.ldap中的docroot/WEB-INF/ext-impl/src并改变它。不要创建CustomPortalLDAPImporterImpl.java

【讨论】:

  • 完全按照你说的做了,但仍然没有任何变化
  • 在 ext 部署之后你重启了服务器吗?同时取消部署并删除旧分机的剩余部分。
  • 我也这样做了
  • 可能没有打印消息(_log.info) 因为com.liferay.portal.security.ldap 上的默认日志级别是ERROR,您必须转到控制面板-> 服务器管理-> 日志级别并更改这个包的日志级别到信息。你试过用eclipse调试这个类吗?
  • 非常感谢帮助伙伴按照您的步骤进行操作,并且成功了。最后一个问题是因为我无法正确地取消部署我的旧 ext 插件,我不得不一个一个地删除文件和 jar。现在我的自定义更改得到了反映,但我的日志仍然没有打印
【解决方案2】:

您的描述中的某些内容听起来不对 - 特别是 ext-plugin 和

  1. 构建并发布我的插件
  2. 从 dist 文件夹中复制 customLdap-ext.war 文件并将其粘贴到我的 tomcat delpoy 文件夹中

虽然这是documented as the steps to deploy in production,但您至少需要重新启动 Liferay(ext 不可热部署)。

另外,请确认 WAR 文件不会在 tomcat 中作为单独的 web 应用程序结束。相反,它将被编织到 Liferay 中,也就是 ROOT Web 应用程序。这是您可以/应该验证的另一件事。并观察记录的重新部署步骤(与第一次部署不同),您基本上需要从头开始重新安装 Liferay 和您的 ext 插件。

我还没有验证您是否可以在此处不使用 ext,记录的步骤是尽可能不使用 ext 的主要原因。

如果您在此问题的另一个答案中遵循 Klimiuk 的建议,请注意在这种情况下您将依赖于类加载器的顺序:一些 JVM/应用程序服务器将首先选择您的实现,而其他 JVM/应用程序服务器将首先选择原始实现。它通常是可重现的 - 例如如果它工作一次,它就会一直工作。至少在您的环境更新改变行为之前,您会突然想知道为什么您的修改不再起作用(如果您幸运地很快发现的话)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 2014-09-21
    • 2023-04-09
    相关资源
    最近更新 更多