Retornar erro do Jasper para o Flex

4 respostas
C

Estou fazendo uma requisição para um Servlet passando alguns parâmetros para exibir um relatório. Caso o usuário entre com um valor errado para o parâmetro (letra ao invés de número, por exemplo) o Jasper lança uma exception mas não exibe nenhuma mensagem para o usuário, apenas aparece o erro no Console. Como faço para enviar uma mensagem do Servlet para o Flex quando ele entra no bloco Catch ?

4 Respostas

F

É só assinar o teu método com throws Exception (ou a exception correspondente) e se for necessário usar a instrução throw para lançar a exceção
Qq exceção irá chegar no Flex como fault.
E no flex vc pode fazer algo como:

public function faultHandler(event:FaultEvent):void {
      var errorMessage:ErrorMessage = event.message as ErrorMessage;
      Alert.show(errorMessage.rootCause.message);
}

[]s

C

Olá Fabio.
Não funcionou. Ocorreu uma exceção do Jasper mas no Flex não dispara o evento FaultEvent.
Fiz uma classe no Flex e no construtor eu passo uma referência de um objeto URLRequest e adiciono o listener FaultEvent.

Essa é a exceção: net.sf.jasperreports.engine.JRException: Error executing SQL statement for :

classe flex:
public function URLRequestMensagem(urlrequest:URLRequest) {
			var loader:URLLoader=new URLLoader();
			configureListeners(loader);
			try {
				loader.load(urlrequest);
			} catch (error:Error) {
                        Alerta.show("Erro URLRequestMensagem ", error.message);
}
}

private function configureListeners(dispatcher:IEventDispatcher):void {
dispatcher.addEventListener(FaultEvent.FAULT, failRequest);
}

private function failRequest(event:FaultEvent):void {
			Alerta.show("falha do request : " + event);
		}

}
Esse é o servlet:
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
.
.
.
parametros.put("SUBREPORT_DIR", sc.getRealPath("WEB-INF/relatorios/")+"/");		    
			reportFile = new File(sc.getRealPath(caminhoArquivo));			
			bytes = JasperRunManager.runReportToPdf(reportFile.getPath(), parametros, con);
			
			if (bytes != null && bytes.length > 0) {
				response.setContentType("application/pdf");
				response.setContentLength(bytes.length);
				ServletOutputStream ouputStream = response.getOutputStream();
				ouputStream.write(bytes, 0, bytes.length);
				ouputStream.flush();
				ouputStream.close();
			}			
		} catch (Exception e) {
			e.printStackTrace();			
		}
}
F

Como comentei antes vc não está deixando subir a exceção, vc a está "segurando" no catch ou remova seu try catch do java deixando subir qq exceção ou a trate como está fazendo e deixe-a subir tb :

[code]
} catch (Exception e) {
e.printStackTrace();
throw e; // deixa subir a exceção.
}
[url]

[]s

C

Acho que o problema não é no Servlet.
Eu fiz:

public byte[] executaReportToPdfFile(String sourceFileName, HashMap parameters,
			Connection conn
			) throws JRException {			
			return JasperRunManager.runReportToPdf(sourceFileName, parameters,	conn);
}

try {
    			bytes = executaReportToPdfFile(reportFile.getPath(), parametros, con);
		    } catch (JRException jre) {
			   throw jre;
		    }

Não adiantou. Ele não deixa colocar “throw jre” dentro do bloco catch.
Quando uso um RemoteObject qualquer exceção, mesmo não subindo, dispara um FaultEvent no flex . . .

Criado 29 de agosto de 2012
Ultima resposta 30 de ago. de 2012
Respostas 4
Participantes 2