0

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

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

4

1 回答 1

0

剖析问题

Liferay 7 是一个开源 Java 平台,因此最好的故障排除方法(没有任何文档)是首先查看代码。您会注意到ExportArticleMVCResourceCommand该类 extends BaseMVCResourceCommand。在ExportArticleMVCResourceCommand该类中,您可以看到该doServeResource方法覆盖了它的父doServeResource方法。里面有BaseMVCResourceCommand几点需要注意。

  1. 它是一个abstract class
  2. protected abstract void doServeResource没有实现的方法。
  3. serveResource方法只是调用doServeResource

拼凑起来

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

解决方案

请记住,该doServeResource方法只是由 中的方法调用serveResourceExportArticleMVCResourceCommand并且该方法在接口和类serveResource中都是公共的。因此,要覆盖 doServeResource 方法,您只需使用适当的注释创建自己的 OSGi 组件,让它覆盖 serveResource 方法,并且不要在自己的末尾引用方法。MVCResourceCommandBaseMVCResourceCommandserveResource

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

}
于 2017-08-16T02:29:37.047 回答