Liferay MVCResourceCommand在本机日志portlet内发送二进制数据
我想通过附加的MVCResourceCommand发送一个二进制文件,我为本机日志portlet编写了代码。但是程序无法使用资源请求提供的OutputStreamLiferay MVCResourceCommand在本机日志portlet内发送二进制数据,liferay,liferay-7,Liferay,Liferay 7,我想通过附加的MVCResourceCommand发送一个二进制文件,我为本机日志portlet编写了代码。但是程序无法使用资源请求提供的OutputStream IOUtils.copy(输入,响应。getPortletOutputStream()) 考虑到: 该代码在结构上运行良好 在自定义portlet中,它也可以工作 在结构中: IOUtils.copy( input, response.getOutputStream() ); 但是,代码抛出了一个IllegalStateExcep
IOUtils.copy(输入,响应。getPortletOutputStream())代码>
考虑到:
该代码在结构上运行良好
在自定义portlet中,它也可以工作
在结构中:
IOUtils.copy( input, response.getOutputStream() );
但是,代码抛出了一个IllegalStateException,表示在调用response.getOutputStream()时正在使用编写器
我知道我们不能把这两者混为一谈
代码没有尝试这样做
我想知道Liferay是否在该请求到达我的BaseMVCResourceCommand扩展之前对其进行了处理,这是专门针对该原生portlet的
我检查了webcontect项目的预览功能,但其URL用于查看模式
URL是从通过JSP片段插入的portlet:resourceURL标记创建的,该命令位于其自己的OSGi模块中
当然,URL是正确的,并且命令会记录它被命中的情况,但随后会引发异常
我试图更改的portlet是:
"com_liferay_journal_web_portlet_JournalPortlet"
有什么想法吗
PS:我知道Servlet和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 );
}
}
}
原因:java.lang.IllegalStateException:无法获取OutputStream,因为编写器已在使用中
位于com.liferay.portlet.MimeResponseImpl.getPortletOutputStream(MimeResponseImpl.java:75)
更新:
这似乎是我的问题(PortletURLImpl)的根源,但仍在寻找解决方案:
if (lifecycle.equals(PortletRequest.RESOURCE_PHASE)) {
_copyCurrentRenderParameters = true;
}
当URL被创建时,它来自于呈现阶段的所有垃圾源。包括MVCPath请显示相关代码,例如您的MVC资源命令或。目前,你声称一切都是对的,但在没有显示代码的情况下,你却在询问不正确的地方的提示。我添加了一个通用代码,隔离了我所关心的行,尽管没有太多额外的信息。