Struts 2 Action + getOutputStream()

1 resposta
berlotto

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:

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;
	}
}

Minha action verdadeira:

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 !
    }
	
}

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...

1 Resposta

berlotto

Bom, eu mesmo vou responder !
O meu problema era o return SUCESS no action…

É que assim o Struts tentava escrever novamente no OutputStream gerando o erro…

se coloco return null, fico tudo na boa…

Desculpem-me pelo post, mas aos 46 do segundo tempo, antes de dormir, na ultima googlada me deu um estalo ! hehehe

Obrigado a todos !

Criado 20 de outubro de 2008
Ultima resposta 20 de out. de 2008
Respostas 1
Participantes 1