MVCResourceCommand для отправки двоичных данных внутри собственного портлета журнала - PullRequest
0 голосов
/ 08 июня 2018

Я хотел бы отправить двоичный файл через добавленную MVCResourceCommand, которую я кодировал для собственного портлета журнала.Но программа не может использовать OutputStream, предоставленный запросом ресурса.

IOUtils.copy( input, response.getPortletOutputStream() );

Учитывая:

  1. Код отлично работает на StrutsActions
  2. В пользовательских портлетах он также работает

В StrutsActions:

IOUtils.copy( input, response.getOutputStream()  );

Однако код выдает исключение IllegalStateException, сообщая, что при вызове response.getOutputStream () используется писатель.

  1. Iзнаю, что мы не можем смешать эти два
  2. Код не пытается сделать это

Интересно, если Liferay что-то делает с этим запросом, прежде чем он достигнет моего расширения BaseMVCResourceCommand, этоспециально для этого нативного портлета.

Я проверил функцию предварительного просмотра для элемента веб-контакта, но его URL-адрес предназначен для режима просмотра.

URL-адрес создается из тега портлета: resourceURL, вставленного через фрагмент JSP, и команда находится в своем собственном модуле OSGi.

Конечно, URL-адрес правильный, и команда регистрирует егобыл сбит, но после этого выдается исключение.

Портлет, который я пытаюсь изменить, это:

"com_liferay_journal_web_portlet_JournalPortlet"

Есть мысли?

PS: Я знаю оСервлет и портлет ResponseUtils.но они также в конечном итоге пытаются получить поток, приводя к тому же исключению.

@Component( immediate = true,
            property = {
                    "javax.portlet.name=" + JOURNAL, "mvc.command.name=/command"
            },
            service = MVCResourceCommand.class )
public class Resource extends BaseMVCResourceCommand {


    @Override
    public void doServeResource( ResourceRequest request, ResourceResponse response ) throws PortletException {

        try {
            response.getPortletOutputStream();
        }
        catch ( Exception e ) {
            throw new PortletException( e );
        }
    }

}

Причина: java.lang.IllegalStateException: Невозможно получить OutputStream, потому что Writer уже используется в com.liferay.portlet.MimeResponseImpl.getPortletOutputStream (MimeResponseImpl.java:75)

Обновление. Похоже, что это источник моих проблем (PortletURLImpl), но я все еще ищу решение:

if (lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
            _copyCurrentRenderParameters = true;
}

Когда URLсоздается он поставляется со всеми источниками мусора из фазы рендеринга.Включая MVCPath

...