【问题标题】:AEM::Writing outputstream to response objectAEM::将输出流写入响应对象
【发布时间】:2019-05-24 19:41:03
【问题描述】:

我正在处理在页面上显示 PDF 文档的要求。该文档以字节数组的形式从后端服务中提取。我将此字节数组转换为输出流,然后将其写入 Sling Servlet 中的响应。 Servlet 从 OSGi 服务获取字节数组。我想知道我是否可以使用 Sling 模型而不是 Sling Servlet。 Sling 模型会调用 OSGi 服务来获取字节数组,但我不确定接下来的步骤。我使用

在 Sling Model 中注入了响应对象
@SlingObject
private SlingHttpServletResponse response;

但它不会成功。任何指导都会有所帮助。

提前致谢

【问题讨论】:

  • 澄清一下:您想要一个使用 OSGi 服务获取 PDF 的 Sling 模型,然后您想要将 PDF 写入response 的输出流?根据需求,您可以使用 Sling 模型来完成,但通常这样的事情是由 Servlet 完成的。您能否解释一下要求是什么以及为什么您认为 Model 比 Servlet 更好?
  • 感谢您的回复@Jens。我的要求是点击一个肥皂电话被调用的 URL。 SOAP 调用以字节数组的形式返回 PDF。我已经为 SOAP 调用编写了 OSGi 服务。
  • 在这种情况下,我会选择一个 servlet。链接指向 servlet,servlet 将执行所有 SOAP 调用等。我不建议为此使用模型。
  • 谢谢@Jens,我也决定这样做。

标签: aem sling


【解决方案1】:

免责声明

在不了解您的具体要求的情况下,我建议您使用 servlet 而不是 Sling 模型。 Sling 模型旨在表示存储库中的 JCR 资源,不会被用作 servlet。


Sling 模型与 servlet 具有不同的“生命周期”。虽然 servlet 被实例化为 OSGi 服务/组件(在大多数情况下是单例),但 Sling 模型可以在单个请求期间多次实例化。所以请注意这种差异及其后果。

也就是说,您有两种选择可以使用 Sling 模型将 PDF 写入响应:

  1. Sling 模型初始化期间
  2. 调用特定方法时

1 的示例:

@Model(adaptables = SlingHttpServletRequest.class)
public class MyModel {

    @SlingObject
    private SlingHttpServletResponse response;

    @OSGiService
    private PDFService pdfService;

    @PostConstruct
    public void init() {
        response.setContentType("application/pdf");

        [... code to write PDF to response ...]
    }
}

注解@PostConstruct的方法在注入所有注解字段后被调用,这样你就可以运行你的初始化代码了。

示例 2:

@Model(adaptables = SlingHttpServletRequest.class)
public class MyModel {

    @SlingObject
    private SlingHttpServletResponse response;

    @OSGiService
    private PDFService pdfService;

    public void writePDFtoResponse() {
        response.setContentType("application/pdf");

        [... code to write PDF to response ...]
    }
}

显然,对于第二个示例,您必须有某种代码来实例化模型并调用 writePDFtoResponse()

【讨论】:

  • 最重要的是最后一句话。吊索模型需要调用一些东西。这是一个 servlet 或一个 sling 组件。对于第一个,最好直接使用servlet。对于第二个,sling 组件几乎肯定会在您的 PDF 之前和/或之后呈现一些额外的字节。这不是你想要的二进制文件。
猜你喜欢
  • 1970-01-01
  • 2018-07-08
  • 1970-01-01
  • 2013-12-14
  • 1970-01-01
  • 1970-01-01
  • 2011-08-15
  • 1970-01-01
相关资源
最近更新 更多