AEM :: Запись выходного потока в объект ответа - PullRequest
0 голосов
/ 24 мая 2019

Я работаю над требованием для отображения PDF документа на странице.Этот документ извлекается из серверной службы в виде байтового массива.Я преобразовываю этот байтовый массив в outputtream и затем записываю его в ответ в Sling Servlet.Сервлет получает байтовый массив из службы OSGi.Мне интересно, возможно ли мне использовать Sling Model вместо Sling Servlet.Sling Model будет вызывать службу OSGi для получения байтового массива, но я не уверен в следующих шагах.Я ввел объект ответа в Sling Model, используя

@SlingObject
private SlingHttpServletResponse response;

Но это не сработает.Любое руководство будет полезно.

Заранее спасибо

1 Ответ

1 голос
/ 25 мая 2019

Отказ от ответственности

Не зная ваших конкретных требований, я бы порекомендовал использовать сервлет вместо использования Sling Model.Предполагается, что Sling Model является представлением ресурса JCR в репозитории, и его не следует использовать как сервлет.


Модель Sling имеет «жизненный цикл», отличный от сервлета.В то время как сервлет создается как сервис / компонент OSGi (который в большинстве случаев является одноэлементным), модель 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().

...