Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在liferay中重写MVCResourceCommand类的受保护方法?_Liferay_Liferay 7 - Fatal编程技术网

如何在liferay中重写MVCResourceCommand类的受保护方法?

如何在liferay中重写MVCResourceCommand类的受保护方法?,liferay,liferay-7,Liferay,Liferay 7,我想重写类ExportArticleMVCResourceCommand中的受保护方法,该方法扩展了BaseMVCResourceCommand类 我想在liferay 7中将期刊文章转换为pdf。我已经用自己的方法编写了这个功能,并希望在doServerSource(…)方法中调用该方法。但是由于doServerSource()受到保护,我无法在提交按钮上调用它。因此,我想问一下如何在liferay 7中重写这个doServerSource()方法。剖析问题 Liferay 7是一个开源Jav

我想重写类
ExportArticleMVCResourceCommand
中的受保护方法,该方法扩展了
BaseMVCResourceCommand

我想在liferay 7中将期刊文章转换为pdf。我已经用自己的方法编写了这个功能,并希望在
doServerSource(…)
方法中调用该方法。但是由于
doServerSource()
受到保护,我无法在提交按钮上调用它。因此,我想问一下如何在liferay 7中重写这个
doServerSource()
方法。

剖析问题 Liferay 7是一个开源Java平台,因此解决问题的最佳方法(没有任何文档)是首先查看代码。您将注意到,
ExportArticleMVCResourceCommand
类扩展了
BaseMVCResourceCommand
。在ExportArticleMVCResourceCommand类中,您可以看到
DoServerSource
方法覆盖其父级的
DoServerSource
方法。在
BaseMVCResourceCommand
中,有几点需要注意

  • 它是一个
    抽象类
  • 存在未实现的
    受保护的抽象void doServerSource
    方法
  • serveResource
    方法只调用
    doServeResource
  • 拼凑 因此,您希望覆盖
    ExportArticleMVCResourceCommand
    类中的
    doServerSource
    方法,因为当“目标扩展名”的类型为PDF(据称)时,该方法不起作用。您不能通过扩展或实现任何*MVCResourceCommand类或接口来覆盖
    DoServerSource
    ,因为它要么受保护(并且您的OSGi组件覆盖是单独绑定的),要么在
    MVCResourceCommand
    接口的情况下它不存在

    解决方案 请记住,
    ExportArticleMVCResourceCommand
    中的
    serversource
    方法只需调用
    doserversource
    方法,
    serversource
    方法在
    MVCResourceCommand
    接口和
    BaseMVCResourceCommand
    类中都是公共的。因此,要覆盖doServerSource方法,您只需使用适当的注释创建自己的OSGi组件,让它覆盖ServerSource方法,而不要在自己的末尾引用
    ServerSource
    方法

    @Component(
        property = {
            "javax.portlet.name=" + JournalPortletKeys.JOURNAL,
            "mvc.command.name=exportArticle"
        },
        service = MVCResourceCommand.class
    public class CustomExportArticleMVCResourceCommand implements MVCResourceCommand {
    
        @Override
        public boolean serveResource
            (ResourceRequest resourceRequest, ResourceResponse resourceResponse) {
    
            // Call your custom method here
           // ExportArticleUtil.sendFile("pdf", resourceRequest, resourceResponse);
        }
    
        @Reference(target = "(component.name=com.liferay.journal.web.internal.portlet.action.ExportArticleMVCResourceCommand)")
        protected MVCResourceCommand mvcResourceCommand;
    
    }
    

    它必须受到保护是有原因的,您是否尝试过使用该方法或任何其他方法来实现相同的目的?