Анализ проблемы
Liferay 7 — это платформа Java с открытым исходным кодом, поэтому лучший способ устранения неполадок (при отсутствии какой-либо документации) — сначала изучить код. Вы заметите, что класс ExportArticleMVCResourceCommand
расширяет класс BaseMVCResourceCommand
. В классе ExportArticleMVCResourceCommand
вы можете видеть, что метод doServeResource
переопределяет родительский метод doServeResource
. В BaseMVCResourceCommand
есть несколько замечаний.
- It is an
abstract class
- Существует метод
protected abstract void doServeResource
без реализации.
- Метод
serveResource
просто вызывает doServeResource
Собираем это вместе
Итак, вы хотите переопределить метод doServeResource
в классе ExportArticleMVCResourceCommand
, потому что этот метод не работает, когда «целевое расширение» имеет тип PDF (якобы). Вы не можете переопределить doServeResource
путем расширения или реализации любого класса или интерфейса *MVCResourceCommand, потому что он либо защищен (и переопределение вашего компонента OSGi поставляется отдельно), либо, в случае интерфейса MVCResourceCommand
, он не существует.
Решение
Помните, что метод doServeResource
просто вызывается методом serveResource
в ExportArticleMVCResourceCommand
, а метод serveResource
является общедоступным как в интерфейсе MVCResourceCommand
, так и в классе BaseMVCResourceCommand
. Поэтому, чтобы переопределить метод doServeResource, вам просто нужно создать свой собственный компонент OSGi с соответствующими аннотациями, чтобы он переопределял метод serveResource, а не упоминаемый метод 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;
}
person
Chris Maggiulli
schedule
16.08.2017