如何为自定义实体配置liferay-ddm:template-selector标签并显示ADT模板
liferay-ddm:template-selector标签 刚好之前帮几个开发者解决过类似的自定义实体搭配DDM模板选择器的问题,我把完整的步骤和踩坑点整理给你,帮你搞定ADT列表不显示的问题:
一、如何在JSP中使用liferay-ddm:template-selector标签?
首先得确保你的JSP页面引入了DDM标签库,然后再添加模板选择器标签,核心是要配置几个关键属性来关联你的自定义实体:
- 引入DDM标签库:
<%@ taglib prefix="liferay-ddm" uri="http://liferay.com/tld/ddm" %>
- 添加模板选择器标签示例:
<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:当前要渲染的自定义实体的主键IDdisplayStyle:用来回显用户之前选中的模板键值(比如模板的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

