Liferay MVCResourceCommand在本机日志portlet内发送二进制数据

Liferay MVCResourceCommand在本机日志portlet内发送二进制数据,liferay,liferay-7,Liferay,Liferay 7,我想通过附加的MVCResourceCommand发送一个二进制文件,我为本机日志portlet编写了代码。但是程序无法使用资源请求提供的OutputStream IOUtils.copy(输入,响应。getPortletOutputStream()) 考虑到: 该代码在结构上运行良好 在自定义portlet中,它也可以工作 在结构中: IOUtils.copy( input, response.getOutputStream() ); 但是,代码抛出了一个IllegalStateExcep

我想通过附加的MVCResourceCommand发送一个二进制文件,我为本机日志portlet编写了代码。但是程序无法使用资源请求提供的OutputStream

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资源命令或。目前,你声称一切都是对的,但在没有显示代码的情况下,你却在询问不正确的地方的提示。我添加了一个通用代码,隔离了我所关心的行,尽管没有太多额外的信息。