Я хотел бы отправить двоичный файл через добавленную MVCResourceCommand, которую я кодировал для собственного портлета журнала.Но программа не может использовать OutputStream, предоставленный запросом ресурса.
IOUtils.copy( input, response.getPortletOutputStream() );
Учитывая:
- Код отлично работает на StrutsActions
- В пользовательских портлетах он также работает
В StrutsActions:
IOUtils.copy( input, response.getOutputStream() );
Однако код выдает исключение IllegalStateException, сообщая, что при вызове response.getOutputStream () используется писатель.
- Iзнаю, что мы не можем смешать эти два
- Код не пытается сделать это
Интересно, если 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