You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为自定义实体配置liferay-ddm:template-selector标签并显示ADT模板

在Liferay中为自定义实体配置并使用liferay-ddm:template-selector标签

刚好之前帮几个开发者解决过类似的自定义实体搭配DDM模板选择器的问题,我把完整的步骤和踩坑点整理给你,帮你搞定ADT列表不显示的问题:

一、如何在JSP中使用liferay-ddm:template-selector标签?

首先得确保你的JSP页面引入了DDM标签库,然后再添加模板选择器标签,核心是要配置几个关键属性来关联你的自定义实体:

  1. 引入DDM标签库:
<%@ taglib prefix="liferay-ddm" uri="http://liferay.com/tld/ddm" %>
  1. 添加模板选择器标签示例:
<liferay-ddm:template-selector
    classNameId="<%= PortalUtil.getClassNameId(CustomEntity.class) %>"
    classPK="<%= customEntity.getCustomEntityId() %>"
    displayStyle="<%= displayStyle %>"
    displayStyleGroupId="<%= themeDisplay.getScopeGroupId() %>"
    name="displayStyle"
    onchange='<%= renderResponse.getNamespace() + "refreshPortlet();" %>'
    portletURL="<%= portletURL %>"
/>

我给你解释下每个属性的作用:

  • classNameId:自定义实体的类名唯一标识,用PortalUtil.getClassNameId()动态获取比硬编码类名更可靠
  • classPK:当前要渲染的自定义实体的主键ID
  • displayStyle:用来回显用户之前选中的模板键值(比如模板的UUID或者名称)
  • displayStyleGroupId:模板所在的站点/组ID,用themeDisplay.getScopeGroupId()获取当前站点ID就对了
  • name:表单提交时的参数名,后续可以通过这个参数获取用户选择的模板
  • onchange:模板切换时触发的JS回调,比如刷新Portlet重新渲染内容
  • portletURL:传递参数的PortletURL,确保切换模板后参数能正确传递到后台

二、完整配置步骤(解决ADT列表不显示的核心)

很多时候ADT列表不显示,都是因为后端没把自定义实体和Liferay的资产框架关联好,或者模板配置不对,我把关键步骤列出来:

1. 把自定义实体注册为Liferay资产实体

DDM模板选择器依赖Liferay的资产框架,所以你需要为自定义实体实现AssetRendererFactory和AssetRenderer,这样Liferay才会把它当成可应用模板的实体。

举个AssetRendererFactory的实现示例:

@Component(
    property = {
        "javax.portlet.name=" + YourPortletKeys.YOUR_CUSTOM_PORTLET,
        "asset.renderer.factory.key=com.yourcompany.model.CustomEntity"
    },
    service = AssetRendererFactory.class
)
public class CustomEntityAssetRendererFactory extends BaseAssetRendererFactory<CustomEntity> {

    public static final String TYPE = "customEntity";

    public CustomEntityAssetRendererFactory() {
        setClassName(CustomEntity.class.getName());
        setLinkable(true);
        setPortletId(YourPortletKeys.YOUR_CUSTOM_PORTLET);
        setSearchable(true);
        setSelectable(true);
    }

    @Override
    public AssetRenderer<CustomEntity> getAssetRenderer(long classPK, int type) throws PortalException {
        CustomEntity customEntity = _customEntityLocalService.getCustomEntity(classPK);
        CustomEntityAssetRenderer assetRenderer = new CustomEntityAssetRenderer(customEntity);
        assetRenderer.setAssetRendererType(type);
        assetRenderer.setServletContext(_servletContext);
        return assetRenderer;
    }

    // 记得实现其他必要方法,比如getType()、getClassName()等
    // 注入需要的LocalService和ServletContext
}

对应的CustomEntityAssetRenderer要实现AssetRenderer接口,至少要实现getClassPK()、getGroupId()这些核心方法,确保Liferay能识别这个实体的资产属性。

2. 创建ADT模板时选择正确的实体类型

在Liferay后台创建ADT模板时,模板类型一定要选你的自定义实体(就是上面AssetRendererFactory里定义的TYPE值customEntity),这样模板才会和你的实体绑定,模板选择器才能加载到这些模板。

如果后台找不到你的实体类型,说明第一步的资产注册没做好,回去检查AssetRendererFactory的注解配置,特别是asset.renderer.factory.key和setClassName有没有写错。

3. 检查标签属性的正确性

刚才的JSP示例里有几个属性绝对不能错:

  • displayStyleGroupId:必须是模板所在的站点ID,如果是全局模板就用GroupConstants.DEFAULT_GROUP_ID,别硬编码数字,用themeDisplay获取更稳妥
  • classNameId:必须是自定义实体的类名ID,用PortalUtil.getClassNameId()动态获取,避免类名变更导致的问题
  • portletURL要正确传递displayStyle参数,这样切换模板后后台能拿到新的模板值

4. 权限排查

有时候模板列表不显示是因为权限问题:

  • 检查ADT模板的权限,确保当前用户有“查看”权限(在模板编辑页面的「权限」选项卡配置)
  • 确认自定义实体的资产权限配置正确,用户有访问该实体的权限

5. 调试小技巧

如果还是不显示,可以用这些方法排查:

  • 在JSP中打印displayStyleGroupId和classNameId的值,确认是否和模板的配置一致
  • 查看Liferay的日志,搜索DDMTemplateLocalService相关的日志,看有没有加载模板的错误信息
  • 直接调用DDMTemplateLocalServiceUtil.getTemplates(groupId, classNameId, DDMTemplateConstants.TEMPLATE_TYPE_DISPLAY)手动查询模板,如果返回空,说明模板没关联正确或者没创建

只要把这些步骤都做好,你的自定义实体ADT模板列表肯定能正常显示啦!

内容的提问来源于stack exchange,提问作者Srushti Patel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:17:22