Как переопределить защищенные методы класса MVCResourceCommand в liferay?

Я хочу переопределить защищенный метод в классе ExportArticleMVCResourceCommand, который расширяет класс BaseMVCResourceCommand.

Я хочу преобразовать журнальные статьи в pdf в liferay 7. Я написал эту функциональность в собственном методе и хочу вызвать этот метод в методе doServeResource(...). Но поскольку doServeResource() защищен, я не могу вызвать его при нажатии кнопки отправки. Поэтому хочу спросить, как переопределить этот метод doServeResource() в liferay 7.


person Abhishek Jain    schedule 01.02.2017    source источник
comment
Он должен быть защищен по какой-то причине, пытались ли вы искать какие-либо другие методы, используя этот или любой другой подход для достижения того же?   -  person Shivam Aggarwal    schedule 02.02.2017


Ответы (1)


Анализ проблемы

Liferay 7 — это платформа Java с открытым исходным кодом, поэтому лучший способ устранения неполадок (при отсутствии какой-либо документации) — сначала изучить код. Вы заметите, что класс ExportArticleMVCResourceCommand расширяет класс BaseMVCResourceCommand. В классе ExportArticleMVCResourceCommand вы можете видеть, что метод doServeResource переопределяет родительский метод doServeResource. В BaseMVCResourceCommand есть несколько замечаний.

  1. It is an abstract class
  2. Существует метод protected abstract void doServeResource без реализации.
  3. Метод 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