Pessoal,
No Struts 2 eu tenho uma action que quero escrever um JSON de resposta no OutPutStream dela. Mas quando eu faço isto tenho um erro de retorno:
Minha action pai:
[code]
public abstract class ThabitActionBase extends ActionSupport implements Preparable , SessionAware, ServletResponseAware, ServletRequestAware {
private static final long serialVersionUID = 1L;
protected Log log = LogFactory.getLog(SystemAction.class);
private Map session;
protected HttpServletResponse response;
protected HttpServletRequest request;
public ThabitActionBase() {
}
@Override
public void prepare() throws Exception {
}
public Map getSession() {
return session;
}
public void setSession(Map session) {
this.session = session;
}
@Override
public void setServletResponse(HttpServletResponse res) {
this.response = res;
}
@Override
public void setServletRequest(HttpServletRequest req) {
this.request = req;
}
public HttpServletResponse getServletResponse(){
return this.response;
}
public HttpServletRequest getServletRequest(){
return this.request;
}
}[/code]
Minha action verdadeira:
[code]
public class SystemAction extends ThabitActionBase {
private static final long serialVersionUID = 1L;
…
public String efetuarLogin( ) {
log.debug("efetuarLogin:::"+getUsuarioId()+"="+getSenha());
// ActionContext.getContext().getSession().put(ThabitConstants.SESSION_USER_OBJECT, getUsuarioId() );
getSession().put(ThabitConstants.SESSION_USER_OBJECT, getUsuarioId() );
if(getSession()!=null){
log.debug("efetuarLogin:::COM SESSIONAWARE!");
}
HttpServletResponse resp = getServletResponse();
ServletOutputStream out = null;
if(resp!=null){
try {
out = resp.getOutputStream();
JSONObject o = new JSONObject();
o.put("nome", "Sérgio Berlotto Jr");
System.out.println("JSON>>>>>>"+o.toString());
out.print(o.toString());
out.flush();
out.close();
} catch (IllegalStateException e) {
log.error("IllegalStateException ESCREVENDO NO OUTPUT!");
} catch (IOException e) {
log.error("ERRO ESCREVENDO NO OUTPUT:",e);
}
}
log.debug("efetuarLogin:::Agora na sessão!");
return SUCCESS; <<--- AQUI ESTÀ O ERRO !
}
}[/code]
O erro que tenho de retorno:
23:36:49,996 DEBUG [SystemAction] efetuarLogin:::er=er
23:36:50,001 DEBUG [SystemAction] efetuarLogin:::COM SESSIONAWARE!
23:36:50,394 INFO [STDOUT] JSON>>>>>>{"nome":"Sérgio Berlotto Jr"}
23:36:50,396 DEBUG [SystemAction] efetuarLogin:::Agora na sessão!
23:36:50,405 DEBUG [InstantiatingNullHandler] Entering nullPropertyValue [target=[com.thabit2.action.SystemAction@1653a31, com.opensymphony.xwork2.DefaultTextProvider@e05be2], property=org]
23:36:50,746 ERROR [[jsp]] Servlet.service() for servlet jsp threw exception
java.lang.IllegalStateException: getOutputStream() has already been called for this response
at org.apache.catalina.connector.Response.getWriter(Response.java:604)
at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:198)
at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:112)
at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125)
at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118)
at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:178)
...
E o que chega na resposta é o erro…
Alguém sabe como faço para simplesmente escrever no outputstream de uma action no Struts2 ?
Obrigado…