04-26-2016 11:48 AM
<webscript>
<shortname>ElasticSearch search and export as Excel</shortname>
<description>ElasticSearch search and export as Excel</description>
<url>/es/exportexcel</url>
<authentication>none</authentication>
<format default=""></format>
</webscript>
public class PublicSearchExportExcelWebScript extends AbstractWebScript {
@Override
public void execute(WebScriptRequest req, WebScriptResponse res) throws IOException {
res.setContentType("application/vnd.ms-excel");
res.setHeader("Content-Disposition", "attachment; filename=\"export.xls\"");
Workbook wb = new HSSFWorkbook();
//….. build Excel
OutputStream contentOutputStream = res.getOutputStream();
wb.write(contentOutputStream);
}
}
ERROR [org.springframework.extensions.webscripts.AbstractRuntime] Exception from executeScript - redirecting to status template error: strict servlet API: cannot call getWriter() after getOutputStream()
java.lang.IllegalStateException: strict servlet API: cannot call getWriter() after getOutputStream()
at weblogic.servlet.internal.ServletResponseImpl.getWriter(ServletResponseImpl.java:324)
at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:148)
at org.springframework.extensions.webscripts.servlet.WebScriptServletResponse.getWriter(WebScriptServletResponse.java:198)
at org.springframework.extensions.webscripts.LocalWebScriptRuntimeContainer.executeScript(LocalWebScriptRuntimeContainer.java:241)
at org.springframework.extensions.webscripts.AbstractRuntime.executeScript(AbstractRuntime.java:377)
at org.springframework.extensions.webscripts.AbstractRuntime.executeScript(AbstractRuntime.java:209)
at org.springframework.extensions.webscripts.servlet.mvc.WebScriptView.renderMergedOutputModel(WebScriptView.java:104)
at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:250)
at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1060)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:798)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:716)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:647)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:552)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:844)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:280)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:254)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:136)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:341)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:238)
at weblogic.servlet.internal.RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:573)
at weblogic.servlet.internal.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:272)
at org.tuckey.web.filters.urlrewrite.NormalRewrittenUrl.doRewrite(NormalRewrittenUrl.java:213)
at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:171)
at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145)
at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92)
at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:381)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3367)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3333)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
at weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:57)
at weblogic.servlet.internal.WebAppServletContext.doSecuredExecute(WebAppServletContext.java:2220)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2146)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2124)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1564)
at weblogic.servlet.provider.ContainerSupportProviderImpl$WlsRequestExecutor.run(ContainerSupportProviderImpl.java:254)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:295)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:254)
ERROR org.springframework.extensions.webscripts.WebScriptException: 03260002 Internal error
at org.springframework.extensions.webscripts.AbstractRuntime.executeScript(AbstractRuntime.java:335)
at org.springframework.extensions.webscripts.servlet.mvc.WebScriptView.renderMergedOutputModel(WebScriptView.java:104)
at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:250)
at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1060)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:798)
Truncated. see log file for complete stacktrace
Caused By: java.lang.IllegalStateException: strict servlet API: cannot call getWriter() after getOutputStream()
at weblogic.servlet.internal.ServletResponseImpl.getWriter(ServletResponseImpl.java:324)
at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:148)
at org.springframework.extensions.webscripts.servlet.WebScriptServletResponse.getWriter(WebScriptServletResponse.java:198)
at org.springframework.extensions.webscripts.AbstractRuntime.executeScript(AbstractRuntime.java:330)
at org.springframework.extensions.webscripts.servlet.mvc.WebScriptView.renderMergedOutputModel(WebScriptView.java:104)
Truncated. see log file for complete stacktrace
// call through to the parent container to perform the WebScript processing
ExtensibilityModel extModel = openExtensibilityModel();
super.executeScript(scriptReq, scriptRes, auth);
closeExtensibilityModel(extModel, scriptRes.getWriter());
String validTemplatePath = container.getTemplateProcessorRegistry().findValidTemplatePath(statusTemplate.getPath());
TemplateProcessor statusProcessor = container.getTemplateProcessorRegistry().getTemplateProcessor(validTemplatePath);
statusProcessor.process(validTemplatePath, statusModel, res.getWriter());
05-11-2016 11:29 AM
05-24-2016 12:10 PM
05-25-2016 11:31 AM
http://localhost:8080/share/proxy/alfresco/<my-alfresco-webscript-url>
http://localhost:8080/alfresco/service/<my-alfresco-webscript-url>
12-06-2017 03:28 AM
Thank you again for your responses, Steven.
Unfortunately it has nothing to do with Alfresco Repository or Share.
I just wanted this feature to work for a simple web application using the Spring Surf library, without any connection to Share or Alfresco.
In my case it is a WebQuickStart application, but it could be any application using the Spring Surf and Spring Webscripts libraries.
Apparently the same problem has been reported by these people here:
[ALF-21949] Conflict between Surf extensibility handling and streaming web script - Alfresco JIRA
I will try to have a look whether I can find a fix for this problem (preferably a generic solution).
01-19-2018 04:59 AM
Finally I have fixed this problem by patching Alfresco Surf, like this:
1) I created a new class inside spring-webscripts-1.2.0.jar :
package org.springframework.extensions.webscripts;
/**
* Represents a type of {@link WebScript} which directly streams the content (such as a binary file) to the {@link WebScriptResponse#getOutputStream()}.
* <p>
* If you want to implement the streaming of the content directly to the OutputStream obtained from the {@link WebScriptResponse},
* then subclass this abstract class and override the method {@link AbstractWebScript#execute(WebScriptRequest, WebScriptResponse)}.
*/
public abstract class OutputStreamWebScript extends AbstractWebScript {
}
As you can see, this is just an empty "marker class".
2) I have modified the following class inside spring-surf-1.2.0.jar : org.springframework.extensions.webscripts.LocalWebScriptRuntimeContainer (the one which was causing the exception):
2a) I have added a new method after executeScript(WebScriptRequest scriptReq, WebScriptResponse scriptRes, Authenticator auth) :
private void executeScriptWithExtensibilityModel(WebScriptRequest scriptReq, WebScriptResponse scriptRes, Authenticator auth) throws IOException
{
WebScript script = scriptReq.getServiceMatch().getWebScript();
if (script instanceof OutputStreamWebScript)
{
// This type of WebScript streams directly the content to the OutputStream of the WebScriptResponse,
// so we must not apply any extensibility model, but call through to the parent container to perform the WebScript processing
super.executeScript(scriptReq, scriptRes, auth);
}
else
{
// For all the other types of WebScripts, apply the extensibility model as needed
ExtensibilityModel extModel = openExtensibilityModel();
super.executeScript(scriptReq, scriptRes, auth);
closeExtensibilityModel(extModel, scriptRes.getWriter());
}
}
2b) I replaced the following lines inside executeScript(WebScriptRequest scriptReq, WebScriptResponse scriptRes, Authenticator auth):
try
{
// call through to the parent container to perform the WebScript processing
ExtensibilityModel extModel = openExtensibilityModel();
super.executeScript(scriptReq, scriptRes, auth);
closeExtensibilityModel(extModel, scriptRes.getWriter());
}
with these lines:
try
{
// call through to the parent container to perform the WebScript processing, applying any ExtensibilityModel
executeScriptWithExtensibilityModel(scriptReq, scriptRes, auth);
}
I will try to see if someone with access to the spring-surf and spring-webscripts repository can commit these improvements, so anyone else can use them in the future.
07-15-2017 04:17 AM
There is one generic example using which you can export any kind of data in excel.Below link will help you understanding that stuff.