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 ?
É 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
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:
[code] 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);
}
}
[/code]
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();
}
}
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
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 . . .