Liferay 7.2 多Portlet共用自定义PanelCategory避免重复面板配置
问题根因
Liferay 控制面板的分类完全基于唯一字符串key做识别和去重,和页面展示的名称没有绑定关系。当前异常是因为在Students模块中重复实现并注册了独立的PanelCategory组件:两个组件虽然配置的显示名称都是“School”,但内部生成的key不一致,因此Liferay会将其判定为两个完全独立的一级分类,最终渲染出两个重名的School面板。
解决步骤
- 删除Students模块中所有自定义面板分类相关的代码,包括独立的
StudentsPanelCategory组件类、独立的StudentsPanelCategoryKeys常量类。面板分类只需要在首次实现的Teachers模块中定义一次,不需要在每个关联的Portlet模块里重复声明。 - 编写Students模块对应的
PanelApp组件时,直接复用Teachers模块已经注册好的分类key,不要自定义新的分类。由于两个是独立的OSGi模块,不需要跨模块依赖,直接硬编码分类key字符串即可(即Teachers模块中TeachersPanelCategoryKeys.CONTROL_PANEL_CATEGORY对应的固定值"Teachers")。 - 检查Students模块的所有类,确保没有再出现注册
PanelCategory服务的@Component注解,避免重复触发分类注册。
参考实现代码
Students模块的PanelApp正确配置如下:
@Component( immediate = true, property = { "panel.app.order:Integer=200", // 直接复用已有分类的key,无需新定义 "panel.category.key=Teachers" }, service = PanelApp.class ) public class StudentsPanelApp extends BasePanelApp { @Override public String getPortletId() { return StudentsPortletKeys.STUDENTS; } @Override @Reference( target = "(javax.portlet.name=" + StudentsPortletKeys.STUDENTS + ")", unbind = "-" ) public void setPortlet(Portlet portlet) { super.setPortlet(portlet); } }
实操注意事项
- 目前你定义的分类key为
"Teachers",但显示名称为“School”,语义不一致容易造成后续维护混淆,建议将分类常量值修改为和语义匹配的"school",保证开发时读代码就能对应上实际的面板内容。 - 可以通过调整
panel.app.order的整数值,控制同一个分类下Teachers、Students两个入口的上下顺序,值越小排名越靠前。 - 重新部署前建议清理OSGi运行目录中的旧模块缓存,避免之前部署的重复PanelCategory组件残留在运行环境中,导致启动后仍显示两个重名分类。
内容的提问来源于stack exchange,提问作者MaFa
相关产品推荐
相关产品推荐

