You need to enable JavaScript to run this app. Liferay 7.2 多Portlet共用自定义PanelCategory避免重复面板配置
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 10:54:03