我想通过附加的MVCResourceCommand发送二进制文件,我为本机日志portlet编码。但是程序无法使用资源请求提供的OutputStream。
IOUtils.copy( input, response.getOutputStream() );
考虑到:
在StrutsActions中:
"com_liferay_journal_web_portlet_JournalPortlet"
但是,代码抛出IllegalStateException,表示当我调用response.getOutputStream()时正在使用writer。
我想知道Liferay在它到达我的BaseMVCResourceCommand扩展之前是否正在使用该请求,这是专门针对该本机portlet的。
我检查了webcontect项目的预览功能,但其URL用于查看模式。
URL是通过JSP片段插入的portlet:resourceURL标记创建的,命令位于自己的OSGi模块中。
当然,URL是正确的,命令会记录它被命中,但之后会抛出异常。
我想要改变的portlet是:
@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 );
}
}
}
有什么想法吗?
PS:我知道Servlet和Portlet ResponseUtils。但他们最终也试图获得流,导致同样的例外。
if (lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
_copyCurrentRenderParameters = true;
}
引起:java.lang.IllegalStateException:无法获取OutputStream,因为Writer已在使用中 at com.liferay.portlet.MimeResponseImpl.getPortletOutputStream(MimeResponseImpl.java:75)
更新: 这似乎是我的问题的根源(PortletURLImpl),但仍在寻找解决方案:
{{1}}
创建URL时,它会带来渲染阶段的所有垃圾源。包括MVCPath