AEM::Writing 输出流到响应对象

AEM::Writing outputstream to response object

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

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

但这行不通。任何指导都会有所帮助。

提前致谢

免责声明

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


Sling 模型与 servlet 有不同的"life cycle"。虽然 servlet 被实例化为 OSGi service/component(在大多数情况下是单例),但 Sling 模型可以在单个请求期间实例化多次。所以请注意这种差异和后果。

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

  1. 吊索模型初始化期间
  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().