如何在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;
}
它必须受到保护是有原因的,您是否尝试过使用该方法或任何其他方法来实现相同的目的?