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

时间:2018-06-07 23:29:00

标签: liferay liferay-7

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

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

考虑到:

  1. 代码在StrutsActions上完美运行
  2. 在自定义portlet中,它也可以使用
  3. 在StrutsActions中:

    "com_liferay_journal_web_portlet_JournalPortlet"
    

    但是,代码抛出IllegalStateException,表示当我调用response.getOutputStream()时正在使用writer。

    1. 我知道我们不能混用这两个
    2. 代码并未尝试这样做
    3. 我想知道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

0 个答案:

没有答案