如何在liferay中覆盖MVCResourceCommand类的受保护方法?

时间:2017-02-01 10:04:30

标签: liferay liferay-7

我想覆盖扩展ExportArticleMVCResourceCommand类的类BaseMVCResourceCommand中的受保护方法。

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

1 个答案:

答案 0 :(得分:0)

解决问题

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

  1. 这是abstract class
  2. protected abstract void doServeResource方法,没有实施。
  3. serveResource方法只需调用doServeResource
  4. 拼凑在一起

    因此,您希望覆盖doServeResource类中的ExportArticleMVCResourceCommand方法,因为当“目标扩展名”属于PDF类型(据称)时,该方法不起作用。您不能通过扩展或实现任何* MVCResourceCommand类或接口来覆盖doServeResource,因为它受到保护(并且您的OSGi组件覆盖是单独捆绑的),或者在MVCResourceCommand接口的情况下它不存在。

    解决方案

    请记住,doServeResource方法只需serveResource中的ExportArticleMVCResourceCommand方法调用,serveResource方法在MVCResourceCommand界面和BaseMVCResourceCommand {1}}课程。因此,要覆盖doServeResource方法,您只需要使用适当的注释创建自己的OSGi组件,让它覆盖serveResource方法,而不是在您自己的末尾使用referened serveResource方法。

    @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;
    
    }