Philip Mundt created SLING-8047:
-----------------------------------
Summary: Rendered/exported JSON requested via
SlingRequestProcessor is not written to output stream
Key: SLING-8047
URL: https://issues.apache.org/jira/browse/SLING-8047
Project: Sling
Issue Type: Bug
Components: Feature Model, Servlets
Reporter: Philip Mundt
While trying to facilitate the {{SlingRequestProcessor}} to get a rendered or
exported JSON representation of a resource, we ran into the problem of the
response always being empty. The HTML rendering worked without any issue.
(See example code of [Get the rendered HTML for an AEM resource, component or
page|http://www.nateyolles.com/blog/2015/10/get-rendered-html-for-an-aem-resource-or-component]
or [https://stackoverflow.com/a/34218708])
Main, observed difference seem to be the method calls to print writer:
h4. JsonRenderer
{{org.apache.sling.servlets.get.impl.helpers.JsonRenderer#render}} uses
{{#write}} method of response's print writer.
h4. ExportServlet (via JacksonExporter)
{{org.apache.sling.models.impl.ExportServlet#doGet}} uses {{#write}} method of
response's print writer.
h4. HTMLRenderer
{{org.apache.sling.servlets.get.impl.helpers.HtmlRenderer#render}} uses
{{#print}} and {{#println}} methods of response's print writer.
h3. Further observations
When the print writer's {{autoFlush}} property is set to true and one uses the
{{#println}} method instead of {{#write}}, the {{JsonRenderer}} will flush the
print writer's buffer to the output stream. Due to wrapping the response in
{{org.apache.sling.scripting.core.impl.helper.OnDemandWriterResponse}} (where
{{autoFlush=false}}) this does not work for the {{ExportServlet}}.
When adding implicit {{#flush()}} calls to both classes, both request scenarios
will work. According to the servlet specification, it should not be necessary
to flush the print writer, as the container must immediately flush all
remaining content to the client upon "termination of the service method of the
servlet".
Please find two test cases for (where implicit {{#flush()}} calls were added):
* JsonRenderer (tbd)
* ExportServlet (tbd)
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)