AEM ::将输出流写入响应对象

时间:2019-05-24 19:41:04

标签: aem sling

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

将响应对象注入了Sling模型
@SlingObject
private SlingHttpServletResponse response;

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

预先感谢

1 个答案:

答案 0 :(得分:1)

免责声明

在不知道您的特定要求的情况下,我建议您使用servlet而不是Sling模型。 Sling模型旨在表示存储库中的JCR资源,不能被滥用为servlet。


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

也就是说,您有两个选择可以将PDF编写为带有Sling模型的响应:

  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()